Entity Framework / .Net 4.0:POCOおよび多対1の関係の保存
-
06-07-2019 - |
質問
SaveChangesを使用するときに多対1のリレーションシップが保存され、次のエラーが発生しないようにプロパティを設定する方法を教えてください。
非常に簡単です。1つのAdTypeに多くの広告があるAdとAdTypeがあります。広告にプロパティがあります:
public class Ad
{
public Int32 AdTypeId { get; set; }
public virtual AdType AdType { get; set; }
}
この関係をカバーするには。
これを行うとき:
someAd.AdType = someAdType;
プロパティは適切に設定されていますが、AdTypeIdは正しく設定されていません。しかし、これは保存しても大丈夫だと思うので心配はありません。
context.SaveChanges();
この時点で問題は、AdTypeプロパティに割り当てられたオブジェクトを使用してAdTypeId列に何を挿入すべきかを判断する代わりに、AdTypeId列に0の値を保存しようとしています(外部キーの問題の原因)。
知っていること:
- この時点で、someAdTypeは 永続化/ IDを持っています。
- AdTypeプロパティが正しく設定されています。
- AdTypeIdは0です。
- データベースに外部キー関係があります。
- AdTypeIdは主キーです。
- 遅延/遅延読み込みをtrueに設定しました
遅延読み込みを許可するように設定されているため、AdTypeを実際に変更しようとしませんでした。
解決
Okは、プロキシ化されていない(その単語を作成しました... Yah)"スナップショットベースの変更追跡"を使用しているため、アプローチ、システムはそれが変更されたという本当の考えを持っていません。
この例では、顧客は純粋です POCOタイプ。 EntityObjectまたは IPOCOベースのエンティティ、変更を行う エンティティに自動的に 状態マネージャーの同期を保つ 自動通知はありません 純粋なPOCOエンティティと Entity Framework。したがって、 状態マネージャーに問い合わせて、考えている 顧客オブジェクトの状態は 持っていても変わらない のいずれかに明示的に変更を加えた エンティティのプロパティ。
したがって、変更があったかどうかを確認するために、 SaveChangesメソッドを使用したAcceptAllChangesAfterSave オプション。
context.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);
そしてそれは動作します。うまくいけば私はそれを正しく理解します...