EF代码中的可空属性首先?

时间:2013-06-06 17:13:34

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

我希望每个人都记得Northwind数据库。因为它有一个Employee表,它自己引用自己。外键被命名为'ReportTo'或类似的东西,而后者又是Nullable字段。

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

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

但EF在数据库中将此字段生成为“非空”。我试图在?之后使用IList<User>,这看起来像IList<User>?这会产生错误。我还尝试将其定义为流畅的API:

modelBuilder.Entity<User>().Property(s => s.ReportsChild).IsOptional();

但是上面两种方式都给了我这个错误:

  

类型'System.Collections.Generic.IList'必须是非可空值类型才能在泛型类型或方法'System.Nullable'中将其用作参数'T'

我上网了,但我可以找到类似于我已经完成的解决方案。

可能是什么原因? 如果我将IList<User>更改为User,它是否仍可正常用作外键? 我怎样才能解决这个错误?

2 个答案:

答案 0 :(得分:4)

您必须写如下

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

修改

public long? ReportsTo { get; set; }

答案 1 :(得分:1)

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

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

  • 将其转移到User实体。并摆脱IList。只需使用任何实体的类型。 (员工?)看this

或者

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

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