1

コードファーストのエンティティフレームワークがあります。
他のテーブルへの外部キーを持つテーブルから行を削除しようとすると、例外が発生します。データを再度ロードしようとしたときに例外を処理した後、削除しようとしている選択したアイテムのナビゲーション キーがnullになる

なぜこれが起こるのか、どうすれば修正できますか。

削除プロセスはとても簡単です:

public class Person
{
     public int ID {get;set;}
     public string Name {get;set;}

     public Something Something {get;set;}
     public ICollection<Profile> Profile {get;set;}
}

try 
{
    var p = en.Person.First(t => t.ID == 14);
    //p.Something here is not null;
    en.Remove(p)
    en.SaveChanges(); // I'm get an exception here
} 
catch { /*error handling */} 
finally 
{
    var p = en.Person.First(t => t.ID == 14);
    //but p.Something here is null;
}

しかし、en.SaveChange()で例外が発生します。

DELETE ステートメントが FOREIGN KEY 制約 "FK_person_profile

これは私のクラスのサンプルです。
そのSomeThingプロパティはナビゲーション キーです。最初にSomething have valueを選択します。しかし、2番目の選択では、最終的にブロックがnullになります。

削除の問題を修正した後、オブジェクトをデータベースに追加した後に同じ問題が発生しました。そのリロード機能は役に立ちません。
なにか提案を?

4

1 に答える 1

1

私はあなたの問題を理解していると思います-あなたはエンティティを削除していて、それはエラーを引き起こしていて、あなたは回復したいと思っています。ただし、finallyブロックで、現在のコンテキストからエンティティを再度取得すると、正しくありません。

問題は、コンテキストがデータベースからリロードされることを期待していることですが、それは完全には機能しません。実際に行っているのは、作業の単位であるコンテキストに戻り、メモリ内のエンティティを取得することです。取得するエンティティには削除のフラグが設定されているため、プロパティが読み込まれていません。データベースから更新する場合は、DbEntityEntry.Reloadを使用して、エントリを使用してエンティティを完全にリロードする必要があります。

コードを使用した例:

var p = en.Person.First(t => t.ID == 14);
en.Entry(p).Reload();
于 2012-11-28T13:23:46.867 に答える