如何使用LINQ to EF实现“选择或插入”任务?

时间:2010-04-13 00:02:55

标签: .net entity-framework

我有一个包含区域,位置和班次的导入过程,其中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;
        }
    }
}

1 个答案:

答案 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();

......无论哪种情况都有效。