如何在EF7或EF核心中更改运行时的数据库模式

Pet*_*Lim 6 entity-framework

我的数据库具有不同的模式,具体取决于运行时的用户选择

我的代码如下:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

经过测试.我用'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();
Run Code Online (Sandbox Code Playgroud)

后来我注意到OnModelCreating只被调用一次,因此在创建相同连接字符串的新上下文实例时永远不会再调用它.

是否可以在运行时使用动态模式?注意:这在EF6中是可行的

小智 -2

我找到了一种在每次创建上下文时重新创建编译模型的方法。

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();
    }
}
Run Code Online (Sandbox Code Playgroud)