1

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」の両方が同じコンテキストにアタッチされます。

この投稿が長くなって申し訳ありませんが、ここで何が起こっているのかまったくわかりません。可能な限り多くの詳細を提供しようとしました. さらに情報が役立つかどうか尋ねてください。

前もって感謝します。

4

1 に答える 1

1

私はエンティティ フレームワークを自分で教えている最中なので、あなたの質問の要点を見逃している可能性があり、確かに専門家ではありません。ただし、そうは言っても、私が自分で解決しなければならなかった問題に遭遇している可能性があります。

「newSite」変数を作成しているコードを投稿しませんでしたが、EF で外部キーを設定するときは、Linq やデータベースでの作業とは異なる方法で行います。EF では、オブジェクトに設定する外部キー値を選択してから設定する必要があります。

これは機能しません:

NewSite = Site.CreateSite("PrimaryKeyValue");
keyToMove.Site = NewSite;

代わりに、次のようにします。

NewSite = MyEntities.Site.Where(site=>site.PrimaryKey==PrimaryKeyValue)
                                .FirstOrDefault();
keyToMove.Site = NewSite;

私はあなたの質問を理解したと思います!

よろしく、マイク

于 2009-08-08T04:54:21.540 に答える