【问题标题】:Nullable Properties in EF Code First?EF Code First 中的可空属性?
【发布时间】:2013-06-02 19:42:36
【问题描述】:

我希望每个人都记得罗斯文数据库。因为它有一个 Employee 表,该表具有对自身的自我引用。外键被命名为“ReportTo”或类似的名称,而这又是一个 Nullable 字段。

我正在尝试使用 EF Code First 和 MVC3 为手头的项目实现这样的表。场景是:有一个 Man 类,User 是从该类派生的。提到的字段“ReportTo”设置在后一个类(用户)上。这是 POCO:

[LocalizedAttribute("ReportTo")]
    public long ReportsTo { get; set; }
    [ForeignKey("ReportsTo")]
    public virtual IList<User> ReportsChild { get; set; }

但 EF 在数据库中将此字段生成为“Not Null”。我尝试在 IList&lt;User&gt; 之后使用 ?,这看起来像 IList&lt;User&gt;? 会产生错误。我也尝试将其定义为流畅的 API:

modelBuilder.Entity&lt;User&gt;().Property(s =&gt; s.ReportsChild).IsOptional();

但是以上两种方式都会给我这个错误:

类型“System.Collections.Generic.IList”必须是不可为空的值类型,才能将其用作泛型类型或方法“System.Nullable”中的参数“T”

我已经在网上冲浪了,但我可以找到与我已经做过的类似的解决方案。

可能是什么原因? 如果我将IList&lt;User&gt; 更改为User,它仍然可以作为外键正常工作吗? 我怎样才能摆脱这个错误?

【问题讨论】:

  • 不应该是public long? ReportsTo { get; set; }吗?这不是你要修复的那个吗?
  • IList&lt;User&gt; 等引用类型已经可以为空。对于非引用类型,您只需要 ? 来表明您想要使用支持将它们设为 null 的新 .NET 包装器。 long?Nullable&lt;long&gt;Nullable&lt;Int64&gt; 相同。
  • 是的,就是这个。但据我所知,它应该是作为实体名称的引用类型,否则 EF 如何理解哪些实体应该相互关联?
  • 顺便说一句,对于引用一组相关实体的导航属性,通常使用ICollection&lt;T&gt; 而不是IList&lt;T&gt;
  • @Yuck:是的,引用类型应该是这样的。但是随着数据库的生成,字段形成为 Not Null!而且我无法插入任何记录,因为收到另一个疯狂的错误:'无法确定相关操作的有效排序。由于外键约束、模型要求或存储生成的值,可能存在依赖关系。'

标签: c# entity-framework ef-code-first nullable


【解决方案1】:

你必须写如下

 public Nullable<long> ReportsTo { get; set; }

编辑

public long? ReportsTo { get; set; }

【讨论】:

  • 是的..它对我来说很好用..我必须将外键设为可为空而不是引用类型..谢谢
  • 一点也不。为了我的声誉,请为我的回答添加声音)))
【解决方案2】:

你实际上是在做一对多的关系。这意味着User 拥有外键。

有两种方法可以解决这个问题。

  • 将其传送给User 实体。并摆脱 IList。只需使用任何实体的类型即可。 (员工?)看this

或者

  • 摆脱以下:因为 EF 应该自动为您映射。 User 表将自动创建该实体 ID 的 FK 列,这是一个(该实体)对多 (User) 关系。

    [LocalizedAttribute("ReportTo")] public long ReportsTo { get; set; } [ForeignKey("ReportsTo")]

【讨论】:

  • Np。如果您没有找到这个答案,请至少投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
相关资源
最近更新 更多