2010-04-13 62 views
3

我有一個導入過程中的區域,位置和班次,其中Shift對象具有Location屬性,Location對象具有Region屬性。如果地區名稱不存在,我創建該地區,並且像明智的地點。我認爲我可以巧妙地將'選擇是否存在或創建'邏輯封裝到區域和位置的助手類中,但是如果我在這些類中使用本地數據上下文,我會遇到附加和分離變得不愉快的開銷。如果我在這些類中包含數據上下文依賴關係,那麼我的封裝感覺破壞了。如何使用LINQ to EF實現「選擇或插入」任務?

實現此目標的理想方法是什麼?或者放置此功能的理想位置在哪裏?在我的例子中,我大量使用.NET 4.0提供的外鍵,並且避免使用實體來支持直接的外鍵值,但這已經開始聞起來了。

例子:

public partial class ActivationLocation 
{ 
    public static int GetOrCreate(int regionId, string name) 
    { 
     using (var ents = new PvmmsEntities()) 
     { 
      var loc = ents.ActivationLocations.FirstOrDefault(x => x.RegionId == regionId && x.Name == name); 
      if (loc == null) 
      { 
       loc = new ActivationLocation {RegionId = regionId, Name = name}; 
       ents.AddToActivationLocations(loc); 
       ents.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 
      } 
      return loc.LocationId; 
     } 
    } 
} 

回答

2

在EF 4,你可以這樣做:

var location = context.Locations.Where(l => l.RegionId == regionId) 
           .DefaultIfEmpty(new Location 
                { 
                 RegionId = regionId, 
                 Name  = name 
                }).First(); 
someOtherObject.Location = location; 
context.SaveChanges(); 

...這兩種情況下工作。

+0

謝謝@Craig,看起來相當有用。可惜我必須等到使用EF 4,直到我的第一個原型後,但我可以睡着我目前的醜陋代碼knopwing優雅的解決方案是在轉角處。 – ProfK 2010-04-13 15:23:25