使用嵌套集合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;
}