6

シナリオ: あるデータベースから別のデータベースに情報を抽出して再配置しようとしています。DB A には取得したいデータがあります。少し異なる構造でDB Bに保存したいと思います。

DB AI は EDMX データベースで生成されたモデルを使用するため、ObjectContext の派生物を使用します。DB BI はコード生成を希望しています。そのため、パッケージ マネージャーを介して EntityFramework 4.1 をインストールすることにより、コード/モデル ファーストのアプローチを使用します。したがって、DB B は DbContext 派生物を使用します

DB A から DB B に情報を保存しようとすると、次のように表示されます。

テスト メソッド RoutIT.Irma.Import.Service.Test.ImportIrma2ProductTests.ImportProducts が例外をスローしました: System.ArgumentException: 「DB A の EDMX モデル内のエンティティ」の概念モデル タイプが見つかりませんでした

実際には、DB B エンティティを DB B の派生 DbContext の DbSet プロパティに追加するときに実行されます。したがって、コードは次のようになります

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
            foreach (FirstPVC pvc in pvcs)
            {
                this._irmaImport.FirstPVCs.Add(pvc); <--
                this._irmaImport.SaveChanges();
            }
            scope.Complete();
        }
 }

上記の矢印 ("<--") でマークされたコード内のポイントで発生します。

FirstPVC は DB B のプロパティですが、矢印の時点で、DB B のコンテキストに属するエンティティの概念モデルがないことに不満を感じています。

DB B エンティティを DB B コンテキストに格納しようとしているので、これは奇妙です。DB A のエンティティを気にする必要があるのはなぜですか。

すべてのコンテキストが同じプロジェクトに含まれています。しかし、DB B の Derived DbContext は、それ自身の DbSet<> プロパティに関する知識しか持っていません。突然、DbSet<> プロパティに何かを追加しようとすると、上記の太字のエラーが表示されます。

なぜこれが起こるのか知っている人はいますか?DbContext が別のコンテキストのエンティティ、特に ObjectContext 派生クラスのエンティティを気にする必要があるのはなぜですか。

おそらく、それが不平を言っているエンティティがこのように見えることに注意することは役に立ちます

[EdmEntityTypeAttribute(NamespaceName="Irma2Model", Name="AccessProvider")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class AccessProvider : EntityObject
{
    /*****...... ******/
}
4

1 に答える 1

6

答えが見つかりましたが、聞きたいことではありません。

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d2a07542-cb33-48ba-86ed-4fdc70fb3f1a

「EDMXファイルのデフォルトのコード生成を使用している場合、生成されたクラスには、EFが各エンティティタイプに使用するクラスを見つけるのに役立つ一連の属性が含まれています。EFには現在、POCOクラスをからロードできないという制限があります。 EF属性を持つクラスを含むアセンブリ(短い答えはノーです。クラスは別々のプロジェクトにある必要があります)。

これはやや人為的な制限であり、私たちが認識していることは苦痛であり、将来的には削除しようとします。」

したがって、回避策は、クラスを2つの異なるアセンブリに分割することです。

于 2011-08-12T15:25:22.980 に答える