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