Ale*_*xey 3 c# entity-framework ef-code-first entity-framework-4.1
我在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; }
}
Run Code Online (Sandbox Code Playgroud)
使用时db.Users.Find(1),会抛出此错误:
'User'上的'WorkedYears'属性无法设置为'null'值.您必须将此属性设置为"Int32"类型的非null值.
注意:user.Id = 1存在于数据库中,记录的WorkedYears为NULL.如果我在数据库中设置WorkedYears = 0,则错误将消失,如果我将属性定义为:public int? WorkedYears{get; set;},则错误也将消失.但我不想使用int ?,并且如果没有设置,也希望列保持NULL.那么还有其他解决方案吗?
非常感谢.
Lad*_*nka 18
您的模型不反映您的数据库,因此它不起作用.你必须定义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; }
}
Run Code Online (Sandbox Code Playgroud)
正确的视图模型:
public class UserModel
{
public int Id { get; set; }
public string Name { get; set; }
public int WorkedYears { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
您的控制器负责转换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<int>() : value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
结束语:如果您的数据库包含可以包含null值的可空字段,则映射类中必须具有nullable属性.没有其它的方法.
| 归档时间: |
|
| 查看次数: |
12327 次 |
| 最近记录: |