C# 添加新实体时处理相关对象空值的方法
我将一个POCO对象传递给一个方法,该方法将创建一个新实体。数据库中的某些字段允许null。创建实体时,我必须根据其中一个字段进行查找。这个查找可能会返回null,这不允许我在主实体添加期间引用它的属性。代码见下文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
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()
的演示。这似乎更好,谢谢!我现在正在试。[更新]是的,这是有效的,是的,它比我要做的要简单。