1

数十億行のデータを持つことができる特定のテーブル (これを ItemTable と呼びます) を持つレガシー データベースがあります。データベースの制限を克服するために、行数が 100,000,000 に達するたびにテーブルを「サイロ」に分割することにしました。したがって、ItemTable が存在し、深夜にプロシージャが実行されて行数がチェックされます。numberOfRows が > 100,000,000 の場合、silo1_ItemTable が作成されます。これからデータベースに追加されるすべてのアイテムは、silo1_ItemTable に追加されます (大きくなるまでは、silo2_ItemTable が存在します...)

テーブル構造が同一であるため、ItemTable と silo1_ItemTable を同じ Item エンティティにマップできますが、実行時にこのマッピングを設定する方法やクエリのテーブル名を指定する方法がわかりません。すべての挿入は最新の siloX_ItemTable に追加する必要があり、すべての読み取りは指定された siloX_ItemTable からのものである必要があります。

データを挿入/読み取るためのテーブル名を提供する別の siloTracker テーブルがありますが、これをエンティティ フレームワークでどのように使用できるかわかりません...

考え?

4

3 に答える 3

0

私のコメントで述べたように、この問題を解決するために、DBSet によって公開されている SQLQuery メソッドを使用しています。すべての項目テーブルはまったく同じスキーマを持っているため、SQLQuery を使用して独自のクエリを定義し、テーブルの名前をクエリに渡すことができます。私のシステムでテストされ、うまく機能しています。

エンティティ フレームワークで生のクエリを実行する方法については、このリンクを参照してください: EF 生のクエリ ドキュメント

誰かが私の質問を解決するためのより良い方法を持っている場合は、コメントを残してください.

[アップデート]

ストアド プロシージャも優れたオプションであることに同意しますが、何らかの理由で、私の管理者はデータベースに変更を加えることに非常に抵抗しています。私 (そして私たちの顧客) にとって、SQL をコードに入れ、生の SQL があるという事実を認める方が簡単です。少なくとも、他のレイヤーからはかなり簡単に隠すことができます。

[/アップデート]

于 2013-06-17T15:04:22.827 に答える
0

この問題の可能な解決策は、DbCompiledModel パラメータでコンテキストの初期化を使用することです。

var builder = new DbModelBuilder(DbModelBuilderVersion.V6_0);
builder.Configurations.Add(new EntityTypeConfiguration<EntityName>());
builder.Entity<EntityName>().ToTable("TableNameDefinedInRuntime");

var dynamicContext = new MyDbContext(builder.Build(context.Database.Connection).Compile());

何らかの理由で EF6 では 2 番目のテーブル要求で失敗しますが、コンテキスト内のマッピングは実行時に正しく見えます。

于 2014-11-20T03:19:02.200 に答える