【发布时间】: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<User> 之后使用 ?,这看起来像 IList<User>? 会产生错误。我也尝试将其定义为流畅的 API:
modelBuilder.Entity<User>().Property(s => s.ReportsChild).IsOptional();
但是以上两种方式都会给我这个错误:
类型“System.Collections.Generic.IList”必须是不可为空的值类型,才能将其用作泛型类型或方法“System.Nullable”中的参数“T”
我已经在网上冲浪了,但我可以找到与我已经做过的类似的解决方案。
可能是什么原因?
如果我将IList<User> 更改为User,它仍然可以作为外键正常工作吗?
我怎样才能摆脱这个错误?
【问题讨论】:
-
不应该是
public long? ReportsTo { get; set; }吗?这不是你要修复的那个吗? -
IList<User>等引用类型已经可以为空。对于非引用类型,您只需要?来表明您想要使用支持将它们设为 null 的新 .NET 包装器。long?与Nullable<long>或Nullable<Int64>相同。 -
是的,就是这个。但据我所知,它应该是作为实体名称的引用类型,否则 EF 如何理解哪些实体应该相互关联?
-
顺便说一句,对于引用一组相关实体的导航属性,通常使用
ICollection<T>而不是IList<T>。 -
@Yuck:是的,引用类型应该是这样的。但是随着数据库的生成,字段形成为 Not Null!而且我无法插入任何记录,因为收到另一个疯狂的错误:'无法确定相关操作的有效排序。由于外键约束、模型要求或存储生成的值,可能存在依赖关系。'
标签: c# entity-framework ef-code-first nullable