2016-05-12 9 views
4

データベースは実行時にユーザーの選択に応じて異なるスキーマを持ちます。EF7またはEFコアで実行時にデータベーススキーマを変更する方法

私のコードは以下の通りです:テスト時

public partial class FashionContext : DbContext 
{ 
    private string _schema; 

    public FashionContext(string schema) : base() 
    { 
     _schema = schema; 
    } 

    public virtual DbSet<Style> Styles { get; set; } 

    protected override void OnConfiguring(DbContextOptionsBuilder options) 
    { 
     options.UseSqlServer(@"Server=.\sqlexpress;Database=inforfashionplm;Trusted_Connection=True;"); 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Style>() 
      .ToTable("Style", schema: _schema); 
    } 
} 

。私は 'schema1'でコンテキストインスタンスを作成しました。 これまでのところとても良いです。

しかし、別のスキーマ 'schema2'を持つ別のコンテキストインスタンスを作成すると、スキーマがまだ 'schema1'になっている結果のデータです。ここで

は実装です:

using (var db = new FashionContext("schema1")) 
     { 
      foreach (var style in db.Styles) 
      { 
       Console.WriteLine(style.Name); 
      } 
     } 

     Console.ReadLine(); 
     Console.Clear(); 

     using (var db = new FashionContext("schema2")) 
     { 
      foreach (var style in db.Styles) 
      { 
       Console.WriteLine(style.Name); 
      } 
     } 

     Console.ReadLine(); 

後、私はOnModelCreatingは一度だけ呼ばれていることに気づいたので、あなたは、同じ接続文字列の新しいコンテキスト・インスタンスを作成するときに、それが再び呼び出されることはありません。

実行時に動的スキーマを使用することはできますか?注:これはEF6で可能です

答えて

-1

各コンテキストの作成時にコンパイルされたモデルを再作成する方法が見つかりました。

public partial class MyModel : DbContext { 

    private static DbConnection _connection 
    { 
     get 
     { 
      //return a new db connection 
     } 
    } 

    private static DbCompiledModel _model 
    { 
     get 
     { 
      return CreateModel("schema name"); 
     } 
    } 

    public MyModel() 
     : base(_connection, _model, false) 
    { 
    } 

    private static DbCompiledModel CreateModel(string schema) 
    { 
     var modelBuilder = new DbModelBuilder(); 
     modelBuilder.HasDefaultSchema(schema); 
     modelBuilder.Entity<entity1>().ToTable(schema + ".entity1"); 
     var builtModel = modelBuilder.Build(_connection); 
     return builtModel.Compile(); 
    } 
} 
+0

この質問はEF Coreについてですが、あなたの答えはEF6です。それはおそらくそれがdownvoted得た理由です。 – bricelam

2

あなたは、外部モデルを構築し、DbContextOptionsBuilder.UseModel()

別の(より高度な)選択肢がIModelCacheKeyFactoryは、アカウントにスキーマを取るために交換することで使用してDbContextにそれを渡すことができます。

関連する問題