为什么EF用空值填充数据库中不存在的实体

本文关键字:不存在 实体 数据库 填充 EF 空值 为什么 | 更新日期: 2023-09-27 18:25:59

当我试图从具有关系的数据库中检索实体,但实际上所有关系都为null时,EntityFramework会用null值填充关系,而不是将关系设置为null。

为什么会发生这种情况?有什么办法可以避免这种模式?

示例:

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"为null。

谢谢,

Igor

为什么EF用空值填充数据库中不存在的实体

这里的问题是您并没有真正展示整个故事。为了有一个Relationship导航属性,必须存在一个为该关系提供关键字的ID。所以你的课必须看起来像这样:

public class Entity{ 
    public Int32 ID {get;set;} 
    public Int32? RelationshipID {get; set;}
    public Relationship relationship {get;set;} 
} 

如果RelationshipID不为null,则会创建一个Relationship对象。如果RelationshipID的值与实际数据项不对应,则这是一个错误,应该引发异常。

若RelationshipID为null,那个么relationship也将为null。

例外情况是,当它是1对多时,在这种情况下,它将是一个ICollection,关系不会为null,但它将是空集合,并且不会有RelationshipID(ID将保存在相关项中)。

如果没有某种钥匙,你就无法建立一段关系。