EF InsertOrUpdate与字符串PK

本文关键字:PK 字符串 InsertOrUpdate EF | 更新日期: 2023-09-27 18:11:00

如果我有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中已经存在具有相同key的对象。ObjectStateManager不能同时跟踪多个对象关键。

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

EF InsertOrUpdate与字符串PK

这是因为当您执行查找时,它返回对象并在缓存中保留副本。然后添加一个新的副本,因此有两个。

相反,你做两件事中的一件。您可以修改查找返回的副本,如果您可以假设CurrencyCode == null意味着它不存在于数据库中,那么只需添加它或附加它。

比如:

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