C# EF代码中的可空属性优先?

C# EF代码中的可空属性优先?,c#,entity-framework,ef-code-first,nullable,C#,Entity Framework,Ef Code First,Nullable,我希望每个人都记得Northwind数据库。因为它有一个Employee表,该表对自身具有自引用。外键被命名为“ReportTo”或类似的名称,而这反过来又是一个可为空的字段 我正在尝试使用EF Code First和MVC3为手头的项目实现这样一个表。场景是:存在一个派生用户的Man类。在后一个类(用户)上设置了提到的字段“ReportTo”。以下是POCO: [LocalizedAttribute("ReportTo")] public long ReportsTo { get; s

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

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

[LocalizedAttribute("ReportTo")]
    public long ReportsTo { get; set; }
    [ForeignKey("ReportsTo")]
    public virtual IList<User> ReportsChild { get; set; }
[LocalizedAttribute(“ReportTo”)]
公共长报告{get;set;}
[外键(“报告”)]
公共虚拟IList ReportsChild{get;set;}
但是EF在数据库中将此字段生成为“NOTNULL”。我尝试在
IList
之后使用
,它看起来像是生成错误的
IList?
。我还尝试将其定义为fluent API,如下所示:

modelBuilder.Entity()

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

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

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

原因可能是什么? 如果我将
IList
更改为
User
,它是否仍能作为外键正常工作?
我怎样才能克服这个错误呢?

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

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

  • 将其转移到
    用户
    实体。并摆脱IList。只需使用任何实体的类型即可。(雇员?)看看

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

    [LocalizedAttribute(“ReportTo”)]
    公共长报告{get;set;}
    [ForeignKey(“ReportsTo”)]


您必须按照以下要求编写

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

它不应该是公开的吗?报告到{get;set;}
?这不是您正在尝试修复的引用类型吗?像
IList
这样的引用类型已经可以为空。对于非引用类型,您只需要使用
,以指示您希望使用新的.NET包装器,该包装器支持将它们设为null
long?
Nullable
Nullable
相同。是的,就是这个。但据我所知,它应该是一个引用类型,作为一个实体的名称,或者EF如何理解哪些实体应该相互关联,对于引用一组相关实体的Nagiviation属性,通常使用
ICollection
而不是
IList
。@恶心:是的,引用类型应该是这样的。。但是,当数据库生成时,字段的形式不是空的!我无法插入任何记录,因为出现了另一个疯狂的错误:“无法确定依赖操作的有效顺序。”。由于外键约束、模型要求或存储生成的值,可能存在依赖关系。'Yes。。这对我很管用。。我必须将外键设置为可空,而不是引用类型。。谢天谢地。为了我的名誉,请给我的答案加上声音。如果你觉得这不是一个答案,至少要投赞成票。
public long? ReportsTo { get; set; }