2011-10-09 76 views
0

如果我有CurrencyId,我會做這樣的事情:EF InsertOrUpdate用繩子PK

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

但我使用一個字符串貨幣代碼的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

這是因爲當你做的查找,它返回的對象,並保持一個副本在緩存中。然後你添加一個新的副本,所以有兩個。

相反,你做了兩件事之一。您可以修改查找返回的副本,如果您可以假定CurrencyCode == null表示它在數據庫中不存在,那麼只需添加它或附加它即可。

所以,像這樣:

var currency = GetByCurrency(entity.CurrencyCode); 

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

謝謝@Mystere人 - 我試圖避免被一個:-)一個修改實體屬性,但它可能是最好的解決方案。 – nubm