c# - 为什么 EF 使用空值填充数据库中不存在的实体?

标签 c# entity-framework code-first

当我尝试从具有关系的数据库中检索实体时,但实际上所有关系都为空,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/

相关文章:

c# - mvc.net 4 的管理 UI 界面

c# - 重写多个返回语句的简单方法

c# - 电子邮件通知架构问题

linq-to-sql - linq to sql 类和 Entity Framework 有什么区别

entity-framework - Entity Framework 6 - GetObjectStateEntries 预期修改的实体具有状态 "Unchanged"

c# - 尝试 EF 代码优先和迁移 - 绊脚石

c# - SSL通信的双向认证

entity-framework - 在 Entity Framework 代码优先中使用动态连接字符串进行迁移(来自文本文件的连接字符串)

entity-framework - 具有列序号 <> 主键序号的 Entity Framework 复合键定义

entity-framework - 单元测试两种方式的EF关系