2

同じレイアウトのテーブルが 2 つあります -

Report Table
   ID
   ReportCol1
   ReportCol2

私が持っている別のデータベースで

 Reporting Table
    ID
    ReportCol1
    ReportCol2

Reportこれらの両方のテーブルからデータをロードするために呼び出される単一のエンティティ モデルを使用したいと考えています。

私のコンテキストクラスでは

public DbSet<Report> Report{ get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new ReportMap());
}

最初のデータベース Report テーブルへの呼び出しで、期待どおりの結果が得られます。

2 番目のデータベースを指すように接続文字列を変更しましたが、テーブル マッピングでテーブルの名前を変更できません。

コメントで説明した理由により、ストアド プロシージャを使用したくありません。

データベース内のテーブル名を除いて、何ができますか(これはオプションではありません)。

4

2 に答える 2

2

この流れるような API を試しましたmodelBuilder.Entity<Report>().ToTable("Reporting");か? 接続先のデータベースに基づいて条件付きでこれを行うように、これを記述する必要がある場合があります。「DatabaseA はこのマッピングと接続文字列を使用する」、「DatabaseB はこの他のマッピングと接続文字列を使用する」と言うことができるように構成する必要がある場合があります。接続文字列を変更するのではなく、名前/キーでデータベースを指定します。であり、アプリはその名前を検索して、実行するマッピング コードを決定します。

if(dbMappingconfig == DbMapping.A)//some enum you create
{
    modelBuilder.Entity<Report>().ToTable("Reporting");
}

これらのエンティティを DisplayReport(Report r) などの他のメソッドに渡してコードを複製する必要がないようにすることが目標の場合は、Reporting クラスと Report クラスの両方に IReport インターフェイスを実装することができます。

EF は継承階層もサポートしているため、同じクラスから継承させることもできますが、データベース間で機能しないという強い思いがあります。

OnModelCreating が再実行されない場合は、既にキャッシュされている可能性があります。modelBuilder.CacheForContextType = false;今後キャッシュしないようにそこに入れ、現在のキャッシュをクリアするには、Clean + Rebuildを実行するだけでよいと思います。これには、キャッシュを再利用する代わりに毎回モデルを再構築するという代償が伴います。本当に必要なのは、接続文字列が変更されるまでキャッシュを使用することです。とにかくキャッシュを手動でクリアする方法はわかりませんが、方法があるかもしれません。モデルの構築を自分で管理できます。

DbModelBuilder builder = new DbModelBuilder();
// Setup configurations
DbModel model = builder.Build(connection);
DbCompiledModel compiledModel = model.Compile();
DbContext context = new DbContext(connection, compiledModel);

ただし、キャッシュを自分で管理する必要があるため、複雑さが増します。

これを検索しているときに、同じページを下っただけでなく、同じことを達成しようとしているように見えるこれに出くわしました。問題の最終セクションを参照してください:エンティティフレームワークモデルをテーブル名に動的にマップする方法

于 2013-02-06T21:28:03.323 に答える
1

各データベースに同じ名前のビューを作成し、変数テーブル名の代わりにそれにマップすることはできますか?

私のソリューションには異なる名前のテーブルのコピーが 2 つあり、2 つのコンテキストと 2 つのマップ ファイル セット (生成されたテキスト テンプレート) を使用して対処しています。

于 2013-02-06T21:34:58.253 に答える