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

C# 添加新实体时处理相关对象空值的方法,c#,entity-framework,C#,Entity Framework,我将一个POCO对象传递给一个方法,该方法将创建一个新实体。数据库中的某些字段允许null。创建实体时,我必须根据其中一个字段进行查找。这个查找可能会返回null,这不允许我在主实体添加期间引用它的属性。代码见下文 Location origin = new Location() { Order = o, LocationTypeKey = ctx.LocationTypes.Where(a => a.TypeName == "Origin").First().Locati

我将一个POCO对象传递给一个方法,该方法将创建一个新实体。数据库中的某些字段允许null。创建实体时,我必须根据其中一个字段进行查找。这个查找可能会返回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);
请注意,如果State的POCO值不能在查找表(States)中产生匹配值,我将尝试为StateKey设置默认值

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


有更好的方法吗?

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

但是,值得注意的是,您编写的代码所做的工作比需要的要多得多——五次往返数据库,其中两次是重复的,所有这些都会带来比您需要的更多的信息

更重要的是,这似乎是一个非常糟糕的主意™ 使用9999作为代码,因为没有相应的州/国家/地区。为什么不使用一个可为空的键值呢

StateKey
CountryKey
更改为可为空的整数,然后是一个改进的版本:

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()
};

尝试使用
.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

这里有一些很好的答案,建议使用
FirstOrDefault()
,它可以防止出现空值;然而,这里有另一个选择:

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

事实上,这就是我想用的。注意,我正在比较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);

我认为你必须颠倒事实condition@ssilas777谢谢,但我只是从OP中复制了它。我不知道它们的实现逻辑是什么。OP正在检查null,但您正在检查notnull。我明白您的意思,很好。也谢谢你的更新。这更像是
.Any()
的演示。这似乎更好,谢谢!我现在正在试。[更新]是的,这是有效的,是的,它比我要做的要简单。