Model View ViewModel パターンに従って、Entity Framework を使用して SQL 2008 データベースとやり取りする WPF アプリを作成しました。
問題:
私の問題は、EF を使用してデータベースの外部キー値を変更できないことです。サイトとキーの 2 つのエンティティがあります。サイトには多くのキーを含めることができます。あるサイトから別のサイトにキーを移動したいと考えています。次のコードを使用してこれを実行しようとしています。
keyToMove.Site = newSite;
dataAccess.SaveChanges(); // this method just does: this.entities.SaveChanges();
私が観察したこと
アプリの残りの部分がこの変更を反映しているため、メモリにはすべて問題ないように見えます (キーは新しいサイトの下に表示されます)。ただし、データベースの外部キーは変更されず、アプリを閉じて再起動すると、すべての変更が失われます。
「keyToMove.Site = newSite;」の後、keyToMove、newSite、および古い Site インスタンスはすべて「Unchanged」の EntityState 値を持ちますが、これは正しくありません。また、SaveChanges は 2 を返します。これは、私をさらに混乱させるだけです。
"Site" プロパティのセッターの実装は、私のモデルの他のナビゲーション プロパティのように見えます。
set
{
((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<Site>("CmsModel.SiteKeyAssociation", "Site").Value = value;
}
SQL プロファイラは、UPDATE に似たものは何もデータベース エンジンに送信されず、非常に長い SELECT のみが送信されることを示しています。
効果がありそうなもの
「キー」エンティティは、列の 1 つに適用された条件に基づいて、別のエンティティから継承します。
AutoFac IOC コンテナーを使用して、データ アクセス クラスのインスタンス (例では "dataAccess") への参照を使用してデータ アクセスを実行する ViewModel を提供しています。
ObjectContext インスタンスは、このクラスのメンバーです (コメントでは「this.entities」として示されています)。
dataAccess インスタンスはシングルトン スコープであるため、ビュー モデル間で共有されるインスタンスは 1 つだけである必要があり、「keyToMove」と「newSite」の両方が同じコンテキストにアタッチされます。
この投稿が長くなって申し訳ありませんが、ここで何が起こっているのかまったくわかりません。可能な限り多くの詳細を提供しようとしました. さらに情報が役立つかどうか尋ねてください。
前もって感謝します。