【问题标题】:Update a model with nested collection, ASP.NET MVC使用嵌套集合更新模型,ASP.NET MVC
【发布时间】:2015-05-06 18:28:39
【问题描述】:

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

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

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

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

CustomerEdit 视图也包括 Addresses,即用户动态添加地址,并且整个集合在表单提交时传递给控制器​​。 在控制器中,我照常更新Customer

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

我还要更新Address的集合:

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

在我向Addresses 添加一条新记录之前,它工作正常。由于它在数据库中不存在,因此保存会引发错误。

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以遍历地址并检查id。根据该值,可以将实体条目的状态设置为AddedModified。在这种情况下,您不必重新创建集合。

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

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

    【讨论】:

    • 如果某些条目被删除了怎么办?检查数据库中的其余部分是否存在于当前集合中?我希望有更优雅的解决方案。
    • Entity Framework 将从您的数据库中删除已删除的条目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多