【问题标题】:Why does EF populate with null values a Entity that does not exist in Database?为什么 EF 用空值填充数据库中不存在的实体?
【发布时间】:2012-02-25 20:00:33
【问题描述】:

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

谢谢,

伊戈尔

【问题讨论】:

  • 我很确定作为 Int32 的属性“property”不能为空。你怎么确定这是违规财产?
  • 这当然不是标准模式。在类似的情况下,我得到 EntityCollections 的项目为零。您的代码是工作代码还是可以替代真实代码?如果是这样,也许您可​​以显示它发生的实际代码?
  • @dtryon,让我们假设,“属性”是 Int32。但这不是重点......如果数据库中不存在实体,为什么我可以访问“属性”?
  • @igor.araujo - 您可以访问它,因为它是 Int32,而不是可为空的 Int32。 Int32 不能为 null,因此在创建类时它必须包含一个值,该值将是默认值,即 0。
  • 他的意思是不应该创建 entity.relationship。 IE。 entity.relationship == null(或应该),所以 entity.relationship.property 应该抛出一个空引用异常,因为当关系为空时,他将尝试访问关系的属性

标签: c# entity-framework code-first


【解决方案1】:

这里的问题是你并没有真正展示整个故事。为了有一个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,并且关系不会为空,但它将是一个空集合,并且不会有RelationshipID(ID将被保存)在相关项目中)。

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

【讨论】:

  • 好吧,我是 ASP .NET MVC 的新手。也许我一直都做错了......但我从来没有将关系 ID 声明为我的类的属性(我认为它是自动的)。我是通过阅读 asp.net 教程开始学习的......而且我不记得那些教程中的这种“模式”。
  • @igor.araujo - 这与 ASP.NET MVC 无关,这是一个与实体框架相关的问题。 EF 和 MVC 是不同的技术。 ID 是必需的,否则框架将不知道如何查找导航属性。它必须知道外键是什么。
  • @igor.araujo - 你不能“做错事”。如果您不定义外键 ID 字段,EF 甚至都不会工作,它只会生成一个错误,告诉您需要 ID。它会说“无法检索关联‘项目’的关联信息。仅支持包含外键信息的模型。”
  • @Mystere_Man,我的意思是我对 .NET Framework 很陌生(我的错误)...我曾经遇到过这个错误一次或多次...而且,事实上,我是强制定义外键。但并非总是如此,不是在每个模型中......而且我不知道它是如何工作的,但它确实如此。
  • @Mystere_Man,然后,我将为我的每个模型定义一个外键......让我们看看我是否能解决我的问题。那么,如果我加载关系,要知道它是否为空,我只需要查看外键吗? (在你的回答中,检查RelationshipID == null?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2017-04-02
  • 2021-10-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多