2011-03-31 68 views
3

我使用EFCode首先在asp.net mvc 3模型中。 (实体框架4.0和EFCode首先0.8) 该模型被定义象下面这样:EFCode首先属性空问题

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

当使用db.Users.Find(1),将引发此错误:

The 'WorkedYears' property on 'User' could not be set to a 'null' value. You must set this property to a non-null value of type 'Int32'.

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

非常感谢。

+1

什么是EFCode First 0.8? EF Code-First的最新版本可以在这里找到:http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-release-candidate-available.aspx它被称为EF 4.1发布候选人。强烈建议升级。 – Slauma 2011-03-31 16:31:14

回答

18

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

正确POCO为EF:

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

结论:如果你的数据库中包含可为空字段,它可以包含空值,你必须为空的财产在你的映射类。别无退路。

+0

非常感谢。我会尽力。但我仍然想要搜索除了可为空的属性之外是否有其他方式。 – Alexey 2011-04-01 02:30:24

+0

我很确定拉迪斯拉夫是正确的,没有其他方法将属性绑定到不可为空的值类型。如果你想到数据库字段的内容是“有一个值,如果没有设置,则为null”,这正是可以为null的类型所允许的。 您可以明确地过滤掉查询中WorkedYears为空的任何条目,这将绕过“错误”。 否则拉迪斯拉夫会提出一个未映射属性的建议,它基本上定义了一个对调用者来说是透明的“默认”值。 – Perry 2011-05-26 05:54:33