我有一个包含区域,位置和班次的导入过程,其中Shift对象具有Location属性,而Location对象具有Region属性。如果区域名称不存在,我创建区域,并且明智的位置。我认为我可以巧妙地将'select if exists,或create'逻辑封装到Region和Location的帮助器类中,但是如果我在这些类中使用本地数据上下文,我会遇到附加和分离开销变得不愉快。如果我在这些类中包含数据上下文依赖项,那么我的封装会感觉破碎。
实现此目标的理想方法是什么,或者放置此功能的理想位置在哪里?在我的例子中,我大量倾向于使用.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;
}
}
}
答案 0 :(得分: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();
......无论哪种情况都有效。