2016-12-19 13 views
0

データを表示するために一連のテーブルから動的に選択しているEntity Frameworkを使用するプログラムがあります。私のOnModelCreating関数内EFデータベースコンテキストがクリアされない

modelBuilder.Entity<Revision>().ToTable("Revisions" + suffix); 

Revisions2016 
Revisions2017 
Revisions2018 

これまでのところ、私は、呼び出しを通じて流暢APIを使用して別のテーブルを選択することができるよ:データベース内の私のテーブルは、の線に沿って何か命名されていますデータベースコンテキスト。私の問題は、私は次のようを通じて新しいデータベースコンテキストを作成しようとしたときにということである。

public static void AccessRevisions(string tableName) 
{ 
    using (var context = new RevisionsContext(tableName)) 
    { 
    var revisionListing = context.Revisions.ToList(); 
    foreach (object o in revisionListing) 
    { 
     Revision r = o as Revision; 
     Console.WriteLine(String.Format("ID: {0} NOTES: {1} AUTHOR: {2}", r.RevisionID, r.RevisionNotes, r.RevisionAuthor)); 
    } 
    } 
} 

「使用」によって限定されると私はデータベースコンテキストの寿命を指定したが、常に古いものを選択してしまうようです関数を呼び出すときに指定されたテーブルに変更するのではなく、テーブルを変更します。つまり、2016と2017を指定した場合、クエリ結果は常に2016と思われます。

context.Database.Initialize(force: true);Database.SetInitializer(new DropCreateDatabaseAlways<RevisionsContext>());を使用してコンテキストの初期設定を強制しようとしましたが、これらは何もしないようです。誰かが適切に私のデータベースコンテキストを再作成する方法や動的にテーブルを切り替える方法について私を指すことができるでしょうか?

答えて

0

検索の時間がたつと、私は自分の問題の潜在的な解決策を見つけたと思います。私がここで見つけたものは、私が持っているのと同じ問題に対する解決策を探していた人たちを助けるために投稿します。ベニーMichielsenによってブログ記事hereからの助けを借りて、私は次のように私のコンテキストクラスを構築してきました:

public class VAMPModelContext : DbContext 
    { 
    private VAMPModelContext(string _ConnectionString) 
     : base(_ConnectionString) 
    { 
     Database.SetInitializer<VAMPModelContext>(null); 
    } 

    private VAMPModelContext(DbCompiledModel compiledModel, string connectionString) 
     : base(compiledModel) 
    { 
     Database.SetInitializer<VAMPModelContext>(null); 
     Database.Connection.ConnectionString = connectionString; 
    } 

    public static VAMPModelContext CreateContext(string suffix) 
    { 
     string connectionString = ConfigurationManager.ConnectionStrings["VAMPTest"].ConnectionString; 
     VAMPModelContext dummyContext = new VAMPModelContext(connectionString); 

     DbModelBuilder builder = new DbModelBuilder(DbModelBuilderVersion.Latest); 
     builder.Configurations.Add(new EntityTypeConfiguration<VAMPModel>()); 

     // Construct model mapping for ORM 
     string tableName = "VAMPModels" + suffix; 
     builder.Entity<VAMPModel>().ToTable(tableName); 

     // Compile ORM object, hard link connection 
     DbConnection dummyConnection = dummyContext.Database.Connection; 
     DbCompiledModel compiledModel = builder.Build(dummyConnection).Compile(); 

     // Finally make our database context 
     dummyContext = new VAMPModelContext(compiledModel, connectionString); 

     return dummyContext; 
    } 

    public virtual DbSet<VAMPModel> ModelsList { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // Adjust field properties for model 
     modelBuilder.Entity<VAMPModel>() 
      .Property(e => e.ModelCode) 
      .IsUnicode(false); 

     modelBuilder.Entity<VAMPModel>() 
      .Property(e => e.PriceAUD) 
      .HasPrecision(18, 0); 

     base.OnModelCreating(modelBuilder); 
    } 
    } 

我々は唯一の通常のコンストラクタによって一度OnModelCreating呼び出すことができますが、生成するためにコンパイルされたモデルを受け入れ、別のコンストラクタがありますコンテキストを最初から。したがって、独自のモデルを作成して渡すと、データベースコンテキストを「再構築」することができます。このクラスから、我々は単にこのようにそれを呼び出すことができます。

using(var context = VAMPModelContext.CreateContext("2016")) 
{ 
    var modelsListing = context.ModelsList.ToList(); 
    foreach (object o in modelsListing) 
    { 
    VAMPModel m = o as VAMPModel; 
    Console.WriteLine(String.Format("MODEL ID: {0} MODEL CODE: {1} PRICE: {2}", m.ModelID, m.ModelCode, m.PriceAUD)); 
    } 
    context.Dispose(); 
} 

私はすべてのCRUD操作の効果をテストしていませんが、挿入とクエリがうまく動作するようです。これは、私が行ってきたEntity-Frameworkの動的テーブルマッピングアプローチの解決策を探していた人にとっては助けになることを願っています。

関連する問題