2012-11-16 53 views
20

當我運行我的應用程序,我點擊一個特定的按鈕,我得到的錯誤:「Y」上的「X」屬性不能設置爲「空」值。您必須將此屬性設置爲類型的非空值「的Int32」

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

酷,所以我去我的實體的項目,轉到Y表,找到X列,右鍵單擊並轉到X的屬性,並查找Nullable設置爲False。

我在SQL中驗證在Y表中,X被設置爲允許空值,它是。

然後我回到我的實體的項目,可爲空設置爲True,保存和構建和我得到:

Error 3031: Problem in mapping fragments starting at line 4049:Non-nullable column "X" in table "Y" is mapped to a nullable entity property. 

我聽說從.edmx文件刪除表,然後重新添加這是一種可能性,但從來沒有這樣做過,並且不瞭解足夠讓人感覺舒服的含義。

我聽說它可以在視圖中,可以在存儲過程中...

還聽說這是一個錯誤。

有沒有人遇到過這種情況,並找到了一個「全線」修復或某種程度的路線圖在哪裏尋找這個錯誤?

謝謝!

+0

您究竟曾嘗試過什麼?我不知道.edmx文件是什麼,但是您可以簡單地按照建議嘗試刪除/重新添加它。如果不能解決問題,請用您的原件替換。您使用某種VCS(版本控制系統),對吧? –

+0

更改實體後是否更新了對象? Y對象中的X屬性可能仍然定義爲'int'而不是'int?' – ktharsis

回答

20
"The "X" property on "Y" could not be set to a 'null' value. You must set this property to a non-null value of type 'Int32'." 

在您的EDMX,如果你走你的Y工作臺下面,然後點擊X列,單擊鼠標右鍵,點擊屬性,向下滾動到Nullable和改變從FalseTrue

如果您收到「映射片段」錯誤,您必須從EDMX中刪除該表並重新添加該表,因爲在模型瀏覽器中它存儲了表屬性以及唯一的方法來刷新該表我知道)是從<database>.Store下的模型瀏覽器中刪除表格,然後使用Update Model from Database..命令檢索它。

+0

但是,這真的是首選答案。 –

0

我確認實體指向了正確的數據庫。

然後,我從.edmx文件中刪除表並將其添加。

問題解決。

0

檢查模型&數據庫都應該相應地定義....

公衆的Int32? X {get;組; } ---->可爲空 因此,在DB 'X' 應該是可空=真

公共的Int32 X {得到;組; } ---->不可爲空 因此在DB'X'應該是可空=假

0

我的問題是,我的模型數據庫與實際(開發)數據庫不同步。所以EDMX認爲它是smallint,但實際的列是int。我更新了模型數據庫到int和EDMX到Int32現在它工作。

2

適合未來的讀者。

我得到這個錯誤,當我有一個多結果存儲過程。

正如在這裏看到:

http://msdn.microsoft.com/en-us/data/jj691402.aspx

如果試圖在第一結果訪問某個項目,做一個.NextResult後,你可能會得到這個錯誤。

從文章:

var reader = cmd.ExecuteReader(); 

    // Read Blogs from the first result set 
    var blogs = ((IObjectContextAdapter)db) 
     .ObjectContext 
     .Translate<Blog>(reader, "Blogs", MergeOption.AppendOnly); 


    foreach (var item in blogs) 
    { 
     Console.WriteLine(item.Name); 
    }   

    // Move to second result set and read Posts 
    reader.NextResult(); 
    var posts = ((IObjectContextAdapter)db) 
     .ObjectContext 
     .Translate<Post>(reader, "Posts", MergeOption.AppendOnly); 


    foreach (var item in posts) 
    { 
     Console.WriteLine(item.Title); 
    } 

現在,如果你把這個代碼

Blog foundBlog = blogs.FirstOrDefault(); 

以前

foreach (var item in posts) 

我想你可以模擬錯誤。

經驗法則:

你還是得把這個東西就像一個DataReader(消防水帶)。

我的需要,我不得不轉換爲List<>

所以我改變了這一點:

foreach (var item in blogs) 
    { 
     Console.WriteLine(item.Name); 
    } 

這樣:

List<Blog> blogsList = blogs.ToList(); 
    foreach (var item in blogsList) 
    { 
     Console.WriteLine(item.Name); 
    } 

,我能夠瀏覽的對象沒有得到錯誤。

這是我遇到它的另一種方式。

private void DoSomething(ObjectResult<Blog> blogs, ObjectResult<Post> posts) 
    { 

    } 

然後這個代碼後(原始樣品中)

foreach (var item in posts) 
{ 
    Console.WriteLine(item.Title); 
} 

把這個代碼:

DoSomething(blogs,posts); 

如果我打電話給該例程,並開始訪問中的項目/屬性博客和帖子,我會遇到這個問題。我明白爲什麼,我應該第一次接觸到它。

+0

我有一個存儲過程返回多個集合,我發現如果我把該字段作爲正確的類型,它照顧了這個問題。如果它是0,數據庫將認爲它是一個整數,而不是一點點。由於一切都很難施展,一旦你施放任何可能被錯誤轉換的字段,它就會停止成爲問題。 –

18

我剛剛更換數據類型intint32?

public Int32 Field{ get; set; } 

public Int32? Field{ get; set; } 

和問題解決

+0

天才!很簡單,但我完全忘了檢查類定義本身。 –

+0

爲我完美工作。感謝您爲我節省了大量時間!不過,我想指出的是,這也適用於「int」。這是我的代碼:\t'public int?成功{get;組; }' – gadildafissh

+0

這是天才!!!!我做了同樣的事情,錯誤消失了 – Marj

0

修正錯誤

Error 3031: Problem in mapping fragments starting at line 4049:Non-nullable column "X" in table "Y" is mapped to a nullable entity property. 

打開EDMX文件,以及XML編輯器,查找你表中

edmx:StorageModels

找到它給出了錯誤的propertie並設置或添加

Nullable="false" >> to Nullable="true"

保存EDMX,在Visual Studio中打開它,建立它。問題解決了

0

在我的情況在數據庫列創建的視圖,我選擇包含空值更改該值通過此select語句:

我的變化

select 
    ..., GroupUuId , .. 

之前我的變化後

select 
    ..., ISNULL(GroupUuId, 0), ... 

對不起,我英文不好

0

這可能公頃當數據庫表允許爲NULL並且存在具有空值的記錄時,並且您嘗試使用EF讀取此記錄,並且映射類不允許爲空值時,則爲ppen。

該解決方案是更改數據庫表,以便它不允許null或更改您的類以允許爲null。

1

對我來說,下面的步驟糾正錯誤:

  1. 「從X'住宅」 Y'表
  2. 保存EDMX
  3. 構建數據庫從型號
  4. 取出
  5. 編譯
  6. 再次將'X'屬性添加到'Y'表(使用非空和int16)
  7. 保存EDMX
  8. 構建來自模型的數據庫
  9. 編譯
相關問題