4

我有 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 可以有一个 Quantities 列表,一个 Quantity 有一个 Unit。如果我想用 Entity Framework 保存一个 Stat,我必须遍历它的 Quantities 列表,并检查 Quantity 是否已经存在,或者是新创建的(数据来自 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();
}

问题是,当多个 Quantities 具有相同的 Unit 时,会出现错误:“ObjectStateManager 中已存在具有相同 key 的对象。ObjectStateManager 无法跟踪具有相同 key 的多个对象。”

我不知道如何将 Stat 的数量和单位列表一起更新。

4

1 回答 1

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);
}
于 2013-08-03T22:34:13.903 回答