带有字符串PK的EF InsertOrUpdate

时间:2011-10-09 23:11:17

标签: c# asp.net entity-framework-4.1 ef-code-first crud

如果我有CurrencyId,我会做这样的事情:

 public void InsertOrUpdate(Currency entity)
        {
            if (entity.CurrencyId == default(int))
            {
                // New entity
                this.dbset.Add(entity);
            }
            else
            {
                // Existing entity
                this.context.Entry(entity).State = EntityState.Modified;
            }
        }

但是我使用字符串CurrencyCode作为PK,我希望能够添加或编辑它。所以我必须检查数据库中是否存在CurrencyCode。我该怎么做?

添加新实体是可以的,但如果我尝试编辑:

 public void InsertOrUpdate(Currency entity)
        {
            if (GetByCurrency(entity.CurrencyCode) == null)
            {
                // New entity
                this.dbset.Add(entity);
            }
            else
            {
                // Existing entity
                this.context.Entry(entity).State = EntityState.Modified;
            }
        }

public Currency GetByCurrency(string currencyCode)
{
    return this.dbset.Find(currencyCode);
}

我正在

  

ObjectStateManager中已存在具有相同键的对象。   ObjectStateManager无法跟踪具有相同对象的多个对象   键。

this.context.Entry(entity).State = EntityState.Modified;

1 个答案:

答案 0 :(得分:1)

那是因为当你执行Find时,它会返回对象并在缓存中保留一个副本。您正在添加新副本,因此有两个。

相反,你做两件事之一。你可以修改find​​返回的副本,如果你可以认为CurrencyCode == null意味着它在数据库中不存在,那么只需添加或附加它。

所以,比如:

var currency = GetByCurrency(entity.CurrencyCode);

if (currency == null)
     this.dbset.Add(entity);
else
     currency.Something = entity.Something;