2016-05-12 59 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核心,但你的答案是EF6。這可能就是爲什麼它被壓低了。 – bricelam

2

,可在外部建立模型,並使用DbContextOptionsBuilder.UseModel()

另一個(更先進的),另一種方法是更換IModelCacheKeyFactory採取的模式考慮它傳遞到DbContext

相關問題