C# EF代码中的可空属性优先?
我希望每个人都记得Northwind数据库。因为它有一个Employee表,该表对自身具有自引用。外键被命名为“ReportTo”或类似的名称,而这反过来又是一个可为空的字段 我正在尝试使用EF Code First和MVC3为手头的项目实现这样一个表。场景是:存在一个派生用户的Man类。在后一个类(用户)上设置了提到的字段“ReportTo”。以下是POCO: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
[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包装器,该包装器支持将它们设为nulllong?
与Nullable
或Nullable
相同。是的,就是这个。但据我所知,它应该是一个引用类型,作为一个实体的名称,或者EF如何理解哪些实体应该相互关联,对于引用一组相关实体的Nagiviation属性,通常使用ICollection
而不是IList
。@恶心:是的,引用类型应该是这样的。。但是,当数据库生成时,字段的形式不是空的!我无法插入任何记录,因为出现了另一个疯狂的错误:“无法确定依赖操作的有效顺序。”。由于外键约束、模型要求或存储生成的值,可能存在依赖关系。'Yes。。这对我很管用。。我必须将外键设置为可空,而不是引用类型。。谢天谢地。为了我的名誉,请给我的答案加上声音。如果你觉得这不是一个答案,至少要投赞成票。
public long? ReportsTo { get; set; }