当我尝试从具有关系的数据库中检索实体时,但实际上所有关系都为空,EntityFramework 会使用空值填充关系,而不是将关系设置为空。
为什么会这样?有什么办法可以避免这种模式?
例子:
public class Entity{
public Int32 ID {get;set;}
public Relationship relationship {get;set;}
}
public class Relationship{
public Int32 ID {get;set;}
public Int32 property {get;set;}
}
如果我尝试,但数据库中没有关系:
Entity entity = context.entities.Include("relationship").SingleOrDefault( e => e.ID == id);
我可以在不触发 NullReferenceException 的情况下访问 entity.relationship,但属性“property”为空。
谢谢,
伊戈尔
最佳答案
这里的问题是您并没有真正展示整个故事。为了有一个 Relationship
导航属性,必须有一个标识该关系的 ID。所以你的类必须看起来像这样:
public class Entity{
public Int32 ID {get;set;}
public Int32? RelationshipID {get; set;}
public Relationship relationship {get;set;}
}
如果 RelationshipID 不为空,则创建一个 Relationship 对象。如果 RelationshipID 的值不对应于实际的数据项,那么这是一个错误,应该抛出异常。
如果 RelationshipID 为空,则关系也将为空。
异常(exception)情况是当它是 1 对多时,在这种情况下它将是一个 ICollection 并且关系不会为 null,但它将是一个空集合,并且不会有 RelationshipID(ID 将被保存在相关项目中)。
没有某种 key 就无法建立关系。
关于c# - 为什么 EF 使用空值填充数据库中不存在的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9447551/