3

我在 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”类型的非空值。

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

非常感谢。

4

1 回答 1

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; }
}

正确的视图模型:

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<int>() : value;
        }
    }
}

结论:如果您的数据库包含可以包含空值的可空字段,则映射类中必须具有可空属性。没有其他办法了。

于 2011-03-31T16:22:56.427 回答