我希望每个人都记得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
,它是否仍可正常用作外键?
我怎样才能解决这个错误?
答案 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")]