带有实体框架的ASP.NET MVC - 更新/保存复杂类型属性

时间:2013-08-03 19:42:38

标签: c# asp.net-mvc-3 entity-framework

我有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();
}

问题是,当更多数量具有相同的单位时,会发生错误:&#34; ObjectStateManager中已存在具有相同密钥的对象。 ObjectStateManager无法使用相同的键跟踪多个对象。&#34;

我不知道如何使用其数量和单位列表更新Stat。

1 个答案:

答案 0 :(得分:1)

正如您所提到的,当多个数量具有相同的单位时,会出现问题。为避免多次添加相同单位,您可以检查单位是否已在数据库中。如果存在则重用现有单元。

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);
}