0

最初にコードでEntityFramework4を使用しています。モデルがあり、構成ファイルに基づいて、このモデルをデータベース内の別のテーブルにマップできるようにしたいと考えています。

モデルの例:

 public class Statistic
{
    [Key]
    public int id { get; set; }
    public string jobName { get; set; }
    public DateTime date { get; set; }
    public int pages { get; set; }
}

各顧客には、使用するテーブル名が指定された構成ファイルがあります。したがって、各顧客は、上記のモデルを使用して(同じデータベース内に)独自のテーブルを持っている必要があります。

Entity Framework 4でこれを行うにはどうすればよいですか?

私は自分のDbContextでこれを試しました:

modelBuilder.Entity<Statistic>().ToTable(tabelName);

しかし、これを使用するときにEFが行うことは、新しいテーブル名を作成して使用するのではなく、既存のテーブル名を新しいテーブル名に変更することです。

ありがとう!

4

1 に答える 1

1

それは不可能。各クラスは、マッピングセットごとに(一般的な場合はコンテキストごとに)1回だけマッピングできます。なんで?データベースへのアクセスポイントはDbSet(またはObjectContext APIのObjectSet)であり、次のように簡単に作成されるためです。

var set = dbContext.Set<Statistics>();

EFは、どのStatisticsクラスのマッピングを使用する必要があるかをどのように知る必要がありますか?正しいテーブルをクエリし、変更を正しいテーブルに保存するために使用するマッピングを認識している必要があります。あなたはおそらくそれがパラメータとして定義されるかもしれないと主張することができますが、それはマッピングの詳細を上位層の外に公開するでしょう-それは望ましくありません。

編集:

アプリケーションロジックが複数の顧客の統計にアクセスする必要がない場合は、顧客ごとに動的にマッピングを作成できます。必要なもの:

  • インスタンスを作成DbModelBuilderし、マッピング(または塗りつぶしConfigurations)を定義します-このステップでは、現在の顧客のテーブルの名前を指定します
  • Buildメソッドを呼び出してDbModelインスタンスを取得します
  • インスタンスを呼び出しCompileDbModelDbCompiledModelインスタンスを取得します
  • コンパイルされたモデルをどこかにキャッシュします。モデルのコンパイルはコストのかかる操作であり、顧客ごとに(およびアプリケーションの再起動ごとに)1回だけ実行する必要があります。
  • コンパイルされたモデルをDbContextコンストラクターに渡し、そのコンテキストインスタンスを使用して、その顧客のデータにのみアクセスします

複数の顧客のデータに同時にアクセスする必要がある場合は、SQLを介してアクセスする必要があります。

于 2012-08-08T20:48:16.787 に答える