【发布时间】:2016-02-11 07:42:01
【问题描述】:
我在一个应用程序中使用 Entity Framework Core (7.0.0-rc1-final),该应用程序有一些我无法控制的表(它们来自带有孤立记录的数据馈送)。以下是我创建的一些简单模型来说明这个问题:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int BuildingId { get; set; }
public virtual Building Building { get; set; }
}
public class Building
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Person> People { get; set; }
}
当我尝试查询一个人所在的建筑物的名称并且记录有一个 BuildingId,而 Building 表中没有与之相关的记录时,会引发错误。
这是我计划如何检查孤立记录的示例:
var person = _dbContext.Person
.AsNoTracking()
.Where(p => p.Id == personId)
.Select(p => new
{
Name = p.Name,
HasBuildingName = p.Building == null,
})
.FirstOrDefault();
这是我在运行上述语句时遇到的异常:
二元运算符 Equal 没有为类型“System.Int32”定义 和“System.Object”。
理想情况下,如果找不到建筑物 ID,我想运行以下代码并让“BuildingName”为空:
var person = _dbContext.Person
.AsNoTracking()
.Where(p => p.Id == personId)
.Select(p => new
{
Name = p.Name,
BuildingName = p.Building == null ? null : p.Building.Name
})
.FirstOrDefault();
这是一个 EF 错误还是有其他方法可以做到这一点?
编辑:
为了清楚起见,在我遇到孤立记录的问题之前,这一切正常:
var person = _dbContext.Person
.AsNoTracking()
.Where(p => p.Id == personId)
.Select(p => new
{
Name = p.Name,
BuildingName = p.Building.Name
})
.FirstOrDefault();
【问题讨论】:
-
可以改为
personId。personId的类型是什么?它来自哪里? -
如果我只是从 person 对象中检索属性,这工作得很好,或者如果我检索 p.Building.Name 它在记录存在时工作得很好。仅当此人的 BuildingId 在 Building 表中不存在时,这才是问题。
-
所以你的意思是你已经打破了 fk 约束?还是没有在数据库中定义 fk 约束?您的 buildingid 不为 null 但有值?即使在以前的 EF 版本中,这也不起作用。
-
不幸的是,我们不控制数据,并且数据库中没有外键约束,如果在 person 表上找不到该对象,我想测试它是否为 null .
标签: c# ef-code-first entity-framework-core