【发布时间】:2015-08-24 14:44:41
【问题描述】:
我正在开发一个 MVC 4 应用程序,我想知道更新相关表数据的最佳方法是什么。
我有两个通过外键相互关联的表...一对多关系:
表格:工资单
ID
PayrollDate
CompanyId
IsProcessed
IsComplete
表格:工资单文件
ID
DocumentUrl
UserId
PayrollId (FK)
IsApproved
我有一个View,它显示Payroll 的PayrollDocuments,如下所示:
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