2014-02-13 82 views
0

我們有如下表在實體框架獲取鍵/ ID如果行存在其他插入行和拿到鑰匙

TABLE [dbo].[SoftwareItems](
[SoftwareItemId] [int] IDENTITY(1,1) NOT NULL, 
[Type] [varchar](32) NOT NULL, 
[SoftwareItem] [varchar](100) NOT NULL) 

什麼是最有效的方式來獲得行的關鍵,如果它存在,或插入新行並返回新行的關鍵字。下面是我到目前爲止:

var ctx = new Entities(); 
     var si = ctx.SoftwareItems.FirstOrDefault(s => s.SoftwareItem1.Equals(SoftwareItem) && string.Compare(s.Type, SoftwareItemType) == 0); 
     if (si != null) 
      return si.SoftwareItemId; 
     else 
     { 
      si = new SoftwareItem(); 
      si.SoftwareItem1 = SoftwareItem; 
      si.Type = SoftwareItemType; 
      ctx.SoftwareItems.Add(si); 
      ctx.SaveChanges(); 
      return si.SoftwareItemId; 
     }  
+0

威爾併發性是一個問題,或僅將一個客戶端一次訪問基礎持久性?你的方式很好,但沒有一個TransactionScope,如果多個客戶端試圖調用你的代碼,它可能容易重複條目。 – MutantNinjaCodeMonkey

+0

好點。併發性是一個問題,如果我們在很短的時間內有兩個請求,那麼我們最終可能會得到兩行具有相同數據的行,但現在我們可以接受。感謝您指出。 – ziddarth

回答

0

避免加載整個現有對象和負荷略有好轉,只有按鍵是:

var ctx = new Entities(); 
int? softwareItemId = ctx.SoftwareItems 
    .Where(s => s.SoftwareItem1.Equals(SoftwareItem) && 
       string.Compare(s.Type, SoftwareItemType) == 0) 
    .Select(s => (int?)s.SoftwareItemId) 
    .FirstOrDefault(); 

if (softwareItemId.HasValue) 
    return softwareItemId.Value; 
else 
{ 
    // your original code... 
} 
+0

小改進但仍然有所改進。謝謝! – ziddarth