c# – 带有实体框架的ASP.NET MVC – 更新/保存复杂类型属性
发布时间:2020-12-15 21:54:27 所属栏目:百科 来源:网络整理
导读:我有3个类,与3个数据库表相关: public class Stat{ public int Id { get; set; } public string Name { get; set; } public ListQuantity Quantities { get; set; }}public class Quantity{ public int Id { get; set; } public string Name { get; set; }
我有3个类,与3个数据库表相关:
public class Stat { public int Id { get; set; } public string Name { get; set; } public List<Quantity> Quantities { get; set; } } public class Quantity { public int Id { get; set; } public string Name { get; set; } public virtual Stat Stat { get; set; } public virtual Unit Unit { get; set; } } public class Unit { public int Id { get; set; } public string Name { get; set; } public string Abbreviation { get; set; } public List<Quantity> Quantities { get; set; } } Stat可以有一个数量列表,一个数量有一个单位.如果我想保存带有实体框架的Stat,我必须遍历其数量列表,并检查数量是否已存在或新创建(数据来自HTML表单). public void UpdateStat(Stat stat) { foreach (Quantity q in stat.Quantities) { if (q.Id == 0) { db.Quantities.Add(q); } else { db.Entry(q).State = EntityState.Modified; } } db.Entry(stat).State = EntityState.Modified; db.SaveChanges(); } 问题是,当更多的数量具有相同的单位时,会发生错误:“ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象.” 我不知道如何使用其数量和单位列表更新Stat. 解决方法
如您所述,当多个数量具有相同的单位时,会出现问题.为避免多次添加相同单位,您可以检查单位是否已在数据库中.如果存在则重用现有单元.
if (q.Id == 0) { var unit=db.Units.FirstOrDefault(u=>u.Id==q.Unit.Id); if(unit!=null) q.Unit=unit; db.Quantities.Add(q); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |