32

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

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

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

ビューに含まれている可能性があり、ストアドプロシージャに含まれている可能性があると聞きました...

また、これはバグだと聞いています。

誰かがこれに出くわし、このエラーを探す場所に関する「全面的な」修正またはある種のロードマップを見つけましたか?

ありがとう!

4

11 に答える 11

32
 "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..

于 2012-11-16T18:16:31.023 に答える
3

将来の読者のために。

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

ここに見られるように:

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

今、行の前に

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

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

于 2014-01-07T17:02:10.433 に答える
3

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

于 2013-09-09T00:52:21.750 に答える
1

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

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

また

public Int32 X {get; 設定; したがって、DB 'X' は Nullable = false である必要があります

于 2013-05-02T07:54:02.490 に答える
1

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

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

問題が解決しました。

于 2012-11-16T18:09:12.927 に答える
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.

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

edmx:ストレージモデル

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

Nullable="false" >> Nullable="true" に

edmx を保存し、ビジュアル スタジオで開いてビルドします。問題が解決しました

于 2014-09-10T12:45:13.740 に答える