asp.net - 使用嵌套集合更新模型,ASP.NET MVC

标签 asp.net sql-server asp.net-mvc entity-framework ado.net

如果有任何建议,我将不胜感激。

我一直在寻找修改集合的正确方法,但不确定哪一个是最好的。

我有一个带有嵌套集合的实体:

public class Customer
{
    //customer properties
    ICollection <Address> Addresses{get; set;}
}

我的 CustomerEdit View 还包括 Addresses,即用户动态添加地址,并将整个集合传递给 Controller 关于表单提交。 在 Controller 中,我照常更新 Customer:

Context.Entry(customer).State = EntityState.Modified;

而且我还必须更新地址的集合:

customer.Addresses.ToList()
                  .ForEach(p => 
                          Context.Entry(p).State = EntityState.Modified);

它工作正常,直到我将新记录添加到地址。由于它不存在于数据库中,因此保存会引发错误。

我知道我可以检查数据库中是否存在该条目 - 修改,否则 - 添加。

但是 Address 实体存在问题。它的主键,例如ID,是身份,即插入到数据库时自动递增。

因此,最初在集合中新的AddressID 等于0。然后,如果我将一个 Address 添加到上下文,那么在添加另一个 Address 之前,我检查第二个 Address 是否在上下文中,它将返回 true,因为第一个是还具有 ID = 0。

另外,好吧,我可以删除整个集合并再次添加它,但这会影响性能。

所以,我非常感谢您的建议。

最佳答案

您可以迭代地址并检查id。根据该值,可以将实体条目的状态设置为“已添加”或“已修改”。在这种情况下,您不必重新创建集合。

    foreach (var a in customer.Addresses)
    {
              model.Entry(a).State = a.ID == 0 ? EntityState.Added :EntityState.Modified;
    }

当然,您可以对客户使用相同的方法。

关于asp.net - 使用嵌套集合更新模型,ASP.NET MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28876963/

相关文章:

SQL Server范围索引的想法

c# - 无法立即连接到新创建的 SQL Server 数据库

javascript - 在 MVC 3 View 中调试 javascript

.net - 您通过单元测试测试什么?

c# - GridView 更新/删除崩溃

c# - 由于 VS2017 中的锁定文件,无法发布 ASP.Net Razor 应用程序

asp.net - 限制访问 Web ASP .NET 应用程序的用户数

html - 样式文件上传 'Browse' 按钮

sql-server - TSQL - 选择计数较高的行,当计数相同时,选择 id 值较高的行

javascript - AJAX 调用后无法显示值 (ASP.NET MVC)