2011-03-31 34 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