使用嵌套集合ASP.NET MVC更新模型

使用嵌套集合ASP.NET MVC更新模型,asp.net,sql-server,asp.net-mvc,entity-framework,ado.net,Asp.net,Sql Server,Asp.net Mvc,Entity Framework,Ado.net,如果有任何建议,我将不胜感激 我一直在寻找修改集合的正确方法,但不确定哪种方法是最好的 我有一个具有嵌套集合的实体: public class Customer { //customer properties ICollection <Address> Addresses{get; set;} } 我还必须更新地址的集合: customer.Addresses.ToList() .ForEach(p =>

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

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

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

public class Customer
{
    //customer properties
    ICollection <Address> Addresses{get; set;}
}
我还必须更新
地址的集合

customer.Addresses.ToList()
                  .ForEach(p => 
                          Context.Entry(p).State = EntityState.Modified);
它工作正常,直到我向
地址添加一条新记录。由于它不存在于数据库中,保存会抛出错误

我知道我可以检查DB-modify,否则-add中是否存在该条目

但是
地址
实体中存在一个问题。它的主键,比如说
ID
,是Identity,即插入数据库时自动递增

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

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


因此,我非常感谢您的建议。

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

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

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

如果删除了一些条目会怎么样?检查数据库中的其余部分是否存在于当前集合中?我希望有更优雅的解决方案。实体框架将从数据库中删除删除的条目。
    foreach (var a in customer.Addresses)
    {
              model.Entry(a).State = a.ID == 0 ? EntityState.Added :EntityState.Modified;
    }