アプリケーションを実行して特定のボタンをクリックすると、エラーが表示されます。
"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ファイルからテーブルを削除してから再度追加することは可能性があると聞いたことがありますが、それを実行したことがないため、快適に実行できるほどの意味を理解していません。
私はそれがビューにある可能性があると聞いたことがあります、ストアドプロシージャにある可能性があります...
これはバグであることも聞いたことがあります。
誰もがこれに遭遇し、「ボード全体」の修正またはこのエラーを探す場所に関する一種のロードマップを見つけましたか?
ありがとう!
"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..
コマンドを使用してテーブルを取得します。
データ型int
をint32?
に置き換えるだけです
public Int32 Field{ get; set; }
に
public Int32? Field{ get; set; }
そして問題は解決されました
将来の読者のために。
複数の結果のストアドプロシージャがあるときにこのエラーが発生しました。
ここに見られるように:
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);
そのルーチンを呼び出して、ブログや投稿のアイテム/プロパティへのアクセスを開始すると、問題が発生します。なぜか理解できますが、初めてそれを捕まえるべきだったのです。
私にとっては、次の手順でエラーを修正しました。
私の場合、選択したDB列のNULL値を含む作成済みビューでは、このselect文でその値を変更します
変更前
select
..., GroupUuId , ..
私の変更後
select
..., ISNULL(GroupUuId, 0), ...
悪い英語でごめんなさい
これは、データベーステーブルでNULLが許可され、NULL値を持つレコードがあり、EFでこのレコードを読み取ろうとし、マッピングクラスがNULL値を許可しない場合に発生する可能性があります。
解決策は、nullを許可しないようにデータベーステーブルを変更するか、nullを許可するようにクラスを変更することです。
エンティティが正しいデータベースを指していることを確認しました。
次に、.edmxファイルからテーブルを削除し、再度追加しました。
問題が解決しました。
私の問題は、Modelデータベースが実際の(dev)データベースと同期していないことでした。そのため、EDMXはsmallint
であると考えましたが、実際の列はintでした。モデルデータベースをint
に更新し、EDMXをInt32
に更新しましたが、現在は機能しています。
モデルとデータベースの両方が適切に定義されていることを確認してください...
パブリックInt32? X {get;セットする; } ----> Nullableしたがって、DB 'X'ではNullable = Trueである必要があります
または
public Int32 X {get;セットする; } ----> not Nullableしたがって、DB 'X'ではNullable = falseでなければなりません
エラーを修正する
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で開いてビルドします。問題が解決しました