web-dev-qa-db-ja.com

「Y」の「X」プロパティを「null」値に設定できませんでした。このプロパティを 'Int32'型のnull以外の値に設定する必要があります

アプリケーションを実行して特定のボタンをクリックすると、エラーが表示されます。

"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がNULLを許可するように設定されていることを確認します。

次に、Entityプロジェクトに戻り、Nullableを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ファイルからテーブルを削除してから再度追加することは可能性があると聞いたことがありますが、それを実行したことがないため、快適に実行できるほどの意味を理解していません。

私はそれがビューにある可能性があると聞いたことがあります、ストアドプロシージャにある可能性があります...

これはバグであることも聞いたことがあります。

誰もがこれに遭遇し、「ボード全体」の修正またはこのエラーを探す場所に関する一種のロードマップを見つけましたか?

ありがとう!

24
Mark Saluta
 "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まで下にスクロールして、FalseからTrueに変更します。 。

「マッピングフラグメント」エラーが表示された場合は、EDMXからテーブルを削除して再追加する必要があります。モデルブラウザーにはテーブルプロパティとそれを更新する唯一の方法が格納されているためですモデルブラウザから<database>.Storeの下のテーブルを削除し、Update Model from Database..コマンドを使用してテーブルを取得します。

26
Bob.

データ型intint32?に置き換えるだけです

public Int32 Field{ get; set; }

public Int32? Field{ get; set; }

そして問題は解決されました

21
Yasir Antaal

将来の読者のために。

複数の結果のストアドプロシージャがあるときにこのエラーが発生しました。

ここに見られるように:

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

今、もしbefore

foreach (var item in posts)

このコードを入れます

Blog foundBlog = blogs.FirstOrDefault();

エラーをシミュレートできると思います。

経験則:

あなたはまだこのことを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);

そのルーチンを呼び出して、ブログや投稿のアイテム/プロパティへのアクセスを開始すると、問題が発生します。なぜか理解できますが、初めてそれを捕まえるべきだったのです。

2
granadaCoder

私にとっては、次の手順でエラーを修正しました。

  1. 「Y」テーブルから「X」プロパティを削除します
  2. EDMXを保存
  3. モデルからデータベースを構築
  4. コンパイル
  5. 「X」プロパティを「Y」テーブルに再度追加します(null不可およびint16を使用)
  6. EDMXを保存
  7. モデルからデータベースを構築
  8. コンパイル
1
redM76

私の場合、選択したDB列のNULL値を含む作成済みビューでは、このselect文でその値を変更します

変更前

 select 
     ..., GroupUuId , ..

私の変更後

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

悪い英語でごめんなさい

1
Ali Sadri

これは、データベーステーブルでNULLが許可され、NULL値を持つレコードがあり、EFでこのレコードを読み取ろうとし、マッピングクラスがNULL値を許可しない場合に発生する可能性があります。

解決策は、nullを許可しないようにデータベーステーブルを変更するか、nullを許可するようにクラスを変更することです。

0
Martin Staufcik

エンティティが正しいデータベースを指していることを確認しました。

次に、.edmxファイルからテーブルを削除し、再度追加しました。

問題が解決しました。

0
Mark Saluta

私の問題は、Modelデータベースが実際の(dev)データベースと同期していないことでした。そのため、EDMXはsmallintであると考えましたが、実際の列はintでした。モデルデータベースをintに更新し、EDMXをInt32に更新しましたが、現在は機能しています。

0
PeterX

モデルとデータベースの両方が適切に定義されていることを確認してください...

パブリックInt32? X {get;セットする; } ----> Nullableしたがって、DB 'X'ではNullable = Trueである必要があります

または

public Int32 X {get;セットする; } ----> not Nullableしたがって、DB 'X'ではNullable = falseでなければなりません

0
Izztraab

エラーを修正する

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

およびxmlエディターでEDMXファイルを開き、テーブルを検索します

edmx:StorageModels

エラーを与えるプロパティを見つけ、設定または追加します

Nullable = "false" >>からNullable = "true"

edmxを保存し、Visual Studioで開いてビルドします。問題が解決しました

0
Vokail