3

我希望每个人都记得罗斯文数据库。因为它有一个 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 在数据库中将此字段生成为“非空”。我曾尝试?完全使用 after IList<User>,这看起来IList<User>?会产生错误。我还尝试将其定义为流畅的 API:

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

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

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

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

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

4

2 回答 2

4

你必须写如下

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

编辑

public long? ReportsTo { get; set; }
于 2013-06-06T18:38:18.253 回答
1

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

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

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

或者

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

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

于 2013-06-06T18:28:31.157 回答