我首先在EFCode mvc 3模型中使用asp.net。(EntityFramework4.0和EFCode最初的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 32”类型的非空值。
注意: user.Id=1存在于数据库中,记录的WorkedYears为NULL。如果我在数据库中设置了WorkedYears =0,错误就会消失,而且如果我定义了像:public int? WorkedYears{get; set;}
这样的属性,这个错误也会消失。但我不希望使用int?,如果不设置,还希望列保持为空。那么还有其他解决办法来解决这个问题吗?
非常感谢。
发布于 2011-03-31 16:22:56
您的模型没有反映您的数据库,因此它不起作用。您必须用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
。如果仍然希望使用单个类,则必须添加第二个非映射属性,该属性将在内部使用空值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<int>() : value;
}
}
}
结论:如果数据库包含可以包含空值的可空字段,则必须在映射的类中具有可空属性。没别的办法了。
https://stackoverflow.com/questions/5502872
复制相似问题