【问题标题】:Updating related table data MVC 4更新相关表数据 MVC 4
【发布时间】:2015-08-24 14:44:41
【问题描述】:

我正在开发一个 MVC 4 应用程序,我想知道更新相关表数据的最佳方法是什么。

我有两个通过外键相互关联的表...一对多关系:

表格:工资单

ID

PayrollDate

CompanyId

IsProcessed

IsComplete

表格:工资单文件

ID

DocumentUrl

UserId

PayrollId (FK)

IsApproved

我有一个View,它显示PayrollPayrollDocuments,如下所示:

for (int i = 0; i < Model.PayrollDocuments.Count; i++)
{            
    @Html.HiddenFor(model => Model.PayrollDocuments[i].ID)
    @Html.HiddenFor(model => Model.PayrollDocuments[i].DocumentUrl)
    @Html.HiddenFor(model => Model.PayrollDocuments[i].UserId)

    PayrollDocument pd = Model.PayrollDocuments[i];
    <div class="editor-label">
        @pd.User.FirstName @pd.User.LastName
    </div>

    <a href="@pd.DocumentUrl" target="_blank">@pd.DocumentUrl</a><br />

    @Html.EditorFor(model => Model.PayrollDocuments[i].IsApproved)
}

View 使用户能够批准为特定Payroll 添加的PayrollDocuments。问题是传递 Payroll 对象来更新两个表只会更新 Payroll 表。

// update payroll
public Payroll UpdatePayroll(Payroll p)
{
   try
   {
        Payroll _p = GetPayroll(p.ID);

        this.Entity.Entry(_p).CurrentValues.SetValues(p);
        this.Entity.SaveChanges();

        return p;
   }
   catch (Exception ex)
   {
        throw ex;
   }
}

我要做的是遍历PayrollDocuments 列表并一一更新它们。我只是好奇这是否是正常做法。更新 Payroll 对象以将 PayrollDocument 添加到数据库时,它可以正常工作。我真的不明白为什么如果不遍历所有对象就无法更新它。

【问题讨论】:

  • 传递给UpdatePayroll 的唯一数据是Payroll 对象,所以这就是更新的全部内容。一个对象之外的任何其他更改(例如在多个其他对象上设置属性)都需要在该逻辑中手动完成。除非我没有完全理解这个问题?无关注意:您的 catch 块是 (1) 多余的和 (2) 丢弃有用的异常信息。它应该被完全删除。
  • 是的,Payroll 对象正在被传递,但是这个对象有一个PayrollDocuments 的列表。在调试PayrollDocument 属性时会更新,但它们永远不会反映在数据库中。除非遍历列表并逐个更新每个列表项。

标签: asp.net-mvc entity-framework


【解决方案1】:

您必须像处理 Payroll 对象一样手动执行此操作。只有这样,实体框架才知道如何处理 PayrollDocuments。如果您在 HTTP 上下文中,您的 Payroll 对象会与任何数据库存储库断开连接。您必须将它们显式添加到存储库并定义每个对象应采取的操作。

【讨论】:

    猜你喜欢
    • 2012-07-13
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2011-11-09
    • 2013-08-17
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多