添加新实体时处理相关对象的空值的方法

时间:2014-02-20 18:56:19

标签: c# entity-framework

我将POCO对象传递给将创建新实体的方法。 DB中的某些字段允许为空。创建实体,我必须根据其中一个字段进行查找。好吧,这个查找可能会返回null,这不允许我在主要实体添加期间引用它的属性。请参阅下面的代码

Location origin = new Location()
{
    Order = o,
    LocationTypeKey = ctx.LocationTypes.Where(a => a.TypeName == "Origin").First().LocationTypeId,
    Address1 = " test address 1",
    Address2 = " test Address 2",
    City = oi.OriginCity,
    StateKey = ctx.States.Where(a => a.StateName == oi.OriginState).First() == null ? 9999 : ctx.States.Where(a => a.StateName == oi.OriginState).First().StateId,
    CountryKey = ctx.Countries.Where(a => a.CountryName == oi.OriginCountry).First().CountryId
};
ctx.Locations.Add(origin);

注意我正在尝试默认StateKey的值,如果我的状态cant的POCO值导致查找表(状态)中的匹配值。

这不起作用,我仍然在处理“Sequence contains no entites”的调用者中遇到异常。当我逐步执行代码时,它在我正在尝试条件空检查的那一行失败。

有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

这里有一些很好的答案,建议FirstOrDefault()可以防止空值;但是,这是另一种选择:

StateKey = ctx.States
              .Where(a => a.StateName == oi.OriginState).Any() 
              ? ctx.States.Where(a => a.StateName == oi.OriginState).FirstOrDefault().StateId
              :9999,

答案 1 :(得分:0)

问题是如果没有实体,.First()方法将失败。一个简单的解决方法是改为调用.FirstOrDefault()

但是,值得注意的是,编写的代码所做的工作比它需要的工作多得多 - 五次往返数据库,其中两次是重复的,所有这些都比你提供更多的信息需要。

更重要的是,使用9999作为没有相应州/国家的代码似乎是一个真的不好的想法。为什么没有可以为空的键值呢?

StateKeyCountryKey更改为可为空的整数,然后是改进版本:

Location origin = new Location()
{
    Order = o,
    LocationTypeKey = ctx.LocationTypes
        .Where(a => a.TypeName == "Origin")
        .Select(a => a.LocationTypeId)
        .First(),
    Address1 = " test address 1",
    Address2 = " test Address 2",
    City = oi.OriginCity,
    StateKey = ctx.States.Where(a => a.StateName == oi.OriginState)
        .Select(a => (int?)a.StateId)
        .FirstOrDefault(),
    CountryKey = ctx.Countries.Where(a => a.CountryName == oi.OriginCountry)
        .Select(a => (int?)a.CountryId)
        .FirstOrDefault()
};

答案 2 :(得分:0)

尝试使用.FirstOrDefault(),如果没有数据,它将返回null,但.First()只会抛出异常

 StateKey = ctx.States.Where(a => a.StateName == oi.OriginState).FirstOrDefault() == null ? 9999 : ctx.States.Where(a => a.StateName == oi.OriginState).First().StateId

答案 3 :(得分:0)

实际上,这就是我想要使用的。注意我比较count而不是null

        Location origin = new Location()
        {
            Order = o,
            LocationTypeKey = ctx.LocationTypes.Where(a => a.TypeName == "Origin").First().LocationTypeId,
            Address1 = " test address 1",
            Address2 = " test Address 2",
            City = oi.OriginCity,
            StateKey = ctx.States.Where(a => a.StateName == oi.OriginState).Count() == 0 ? 9999 : ctx.States.Where(a => a.StateName == oi.OriginState).First().StateId,
            CountryKey = ctx.Countries.Where(a => a.CountryName == oi.OriginCountry).First().CountryId
        };
        ctx.Locations.Add(origin);