EFCode First Property Null问题

我在asp.net mvc 3模型中使用EFCode First。 (Entity Framework 4.0和EFCode First 0.8)模型定义如下:

public class User { [Key] public int Id { get; set; } public string Name { get; set; } public int WorkedYears { get; set; } } 

当使用db.Users.Find(1) ,会抛出此错误:

‘User’上的’WorkedYears’属性无法设置为’null’值。 您必须将此属性设置为“Int32”类型的非null值。

注意:user.Id = 1存在于数据库中,记录的WorkedYears为NULL。 如果我在数据库中设置WorkedYears = 0,则错误将消失,如果我将属性定义为: public int? WorkedYears{get; set;} public int? WorkedYears{get; set;} public int? WorkedYears{get; set;} ,错误也会消失。 但是我不想使用int ?,并且如果没有设置,也希望列保持NULL。 那么还有其他解决方案吗?

非常感谢。

您的模型不反映您的数据库,因此它不起作用。 您必须使用int?定义WorkedYears int? 。 如果您的视图必须具有此属性,则必须定义新类“视图模型”,其中WorkedYears将为null,并处理在数据库包含null时该属性应包含的内容。

纠正EF的POCO:

 public class User { [Key] public int Id { get; set; } public string Name { get; set; } public int? WorkedYears { get; set; } } 

正确的视图模型:

 public class UserModel { public int Id { get; set; } public string Name { get; set; } public int WorkedYears { get; set; } } 

您的控制器负责转换User < - > UserModel 。 如果您仍想使用单个类,则必须添加第二个未映射的属性,该属性将在内部使用nullabe WorkedYears:

 public class User { [Key] public int Id { get; set; } public string Name { get; set; } public int? WorkedYears { get; set; } [NotMapped] public int WorkedYearsDisplay { get { return WorkedYears ?? 0; } set { WorkedYears = value == 0 ? new Nullable() : value; } } } 

结束语:如果您的数据库包含可以包含null值的可空字段,则映射类中必须具有nullable属性。 没有其它的方法。