1

背景:

同じソリューション内に、同じモデル クラスを共有する Web API プロジェクトとクラス ライブラリ プロジェクトがあります。両方のプロジェクトが同じデータベースを共有し、どちらも DbContext を使用してデータの読み取り/書き込みを行います。

Web API プロジェクトは、典型的な UnitOfWork パターンでセットアップされ、問題なく動作します。

クラスプロジェクトは少し異なります。Web.config ファイルではなく、コンストラクターで接続文字列を指定します。

class MyContext : DbContext
{
    public MyContext(string connectionString)
        : base()
    {
        // Do this to force me to use eager loading
        this.Configuration.LazyLoadingEnabled = false;
        // Init connection string
        this.Database.Connection.ConnectionString = connectionString;
        Database.SetInitializer <CFCalcContext> (null);
    }


    ... DbSets ...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        ... modelBuilder details ...
    }
}

Web API を使用して、クラス ライブラリで定義された関数を呼び出します。クラス ライブラリを使用してデータベースにクエリを実行しようとすると、エラーが発生します。

問題:

クラス ライブラリ プロジェクトでは、次のような内部例外を持つ EntityCommandCompilationException を取得します。

InnerException: System.Data.MappingException HResult=-2146232032 Message= (82,10): エラー 3034: 行 82、90 で始まるフラグメントのマッピングの問題: 異なるキーを持つ 2 つのエンティティが同じ行にマップされています。これらの 2 つのマッピング フラグメントが、異なるキーを持つエンティティの 2 つのグループを同じ行のグループにマップしないようにしてください。

(82,10) : エラー 3034: 行 82、98 で始まるフラグメントのマッピングの問題: 異なるキーを持つ 2 つのエンティティが同じ行にマップされています。これらの 2 つのマッピング フラグメントが、異なるキーを持つエンティティの 2 つのグループを同じ行のグループにマップしないようにしてください。

(82,10) : エラー 3034: 行 82、106 で始まるフラグメントのマッピングの問題: 異なる主キーを持つ 2 つの行が同じエンティティにマップされています。これらの 2 つのマッピング フラグメントが、同じキーを持つエンティティの 2 つのグループを重複する 2 つの行のグループにマップしないようにしてください。

(82,10): エラー 3034: 行 82、112 で始まるフラグメントのマッピングの問題: 異なるキーを持つ 2 つのエンティティが同じ行にマップされています。これらの 2 つのマッピング フラグメントが、異なるキーを持つエンティティの 2 つのグループを重複する 2 つの行のグループにマップしないようにしてください。

(82,10) : エラー 3034: 行 82、118 で始まるフラグメントのマッピングの問題: 異なるキーを持つ 2 つのエンティティが同じ行にマップされています。これらの 2 つのマッピング フラグメントが、異なるキーを持つエンティティの 2 つのグループを重複する 2 つの行のグループにマップしないようにしてください。

(90,10) : エラー 3034: 行 90、98 で始まるフラグメントのマッピングの問題: 異なるキーを持つ 2 つのエンティティが同じ行にマップされています。これらの 2 つのマッピング フラグメントが、異なるキーを持つエンティティの 2 つのグループを同じ行のグループにマップしないようにしてください。

また、派生した DbContext クラス (クラス ライブラリ内) を右クリックし、Entity Framework Power Tools を使用して "エンティティ データ モデルを表示" すると、次のエラーが表示されます: "DbContext から派生した構築可能な型が、選択したファイルに見つかりませんでした。 " これは、Web API プロジェクトで問題なく機能します。

同じデータベースに接続し、基本的に同じように構成されている 2 つの DbContext のパフォーマンスが異なるのはなぜですか? 構成手順が欠落しているに違いありませんが、どれがわかりません。

助けてくれてありがとう!

4

1 に答える 1

0

ここで多くのことが起こっています。まず、接続文字列を手動で設定する場合は、基本コンストラクターへの呼び出しで設定する必要があります。

public MyContext(string connectionString)
    : base(connectionString)

第二に、実際にはそれを Web.Config に入れる必要があります。名前が問題である場合は、次のように別の名前を付けることができます。

public MyContext()
    : base("Whatever name I used in Web.Config")

3番目に、これはおそらく間違っています:

Database.SetInitializer <CFCalcContext> (null);

Database.SetInitializerのドキュメントには次のように記載されています。

データベースの初期化戦略を取得または設定します。データベース初期化戦略は、DbContext インスタンスが DbCompiledModel から初期化されるときに呼び出されます。

言い換えれば、それを null に設定すると、何かをしようとするとすぐに DbContext が爆発する可能性があります - それがここであなたに起こっていることだと思います.

于 2013-04-05T17:21:23.000 に答える