实体框架多租户和动态架构

时间:2015-09-08 10:12:20

标签: c# sql-server asp.net-mvc entity-framework

我对Entity Framework和具有多个模式名称的DBContext有问题。它只有在我删除dbo .__ MigrationHistory表或特定条目时才有效。

首先是我的DatabaseContext:

public class AppTenantDatabaseContext : DbContext, IServiceStatusDatabaseContext, IDbModelCacheKeyProvider
{
    public DbSet<Container> Items{ get; set; }

    protected string _prefix;

    public AppTenantDatabaseContext(string prefix, string connectionStringName) : base(connectionStringName)
    {
        this.Configuration.LazyLoadingEnabled = false;
        _prefix = prefix;
        System.Data.Entity.Database.SetInitializer(new CreateDatabaseIfNotExists<AppTenantDatabaseContext>());
    }

    public AppTenantDatabaseContext(string prefix) : base("AppFramework")
    {
        this.Configuration.LazyLoadingEnabled = false;
        _prefix = prefix;
        System.Data.Entity.Database.SetInitializer(new CreateDatabaseIfNotExists<AppTenantDatabaseContext>());
    }

    public AppTenantDatabaseContext() : this(string.Empty) { }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema(this._prefix);            
        modelBuilder.Entity<Container>().ToTable("Container", schemaName: _prefix);
        base.OnModelCreating(modelBuilder);
    }

    public string CacheKey
    {
        get { return this._prefix; }
    }
}

如果我运行DBContext,表中的条目__MigrationHistory将为包含模式的模型的完整类名的ContextKey添加。如果我想为另一个模式创建表,则代码在异常中运行,因为模型不同。这是可以理解的。

现在我的问题: 如何实现它以使用迁移历史记录表而不删除它?

在我的意见中,如果__MigrationHistory表将在模式名称而不是“dbo”中创建,或者__MigrationHistory表包含与类名称组合的条目foreach模式名称,则它可以工作。我怎么能这样做?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

  

如何使用迁移历史记录表来实现它而不删除它?

您可以使用Database.SetInitializer<MyContext>(null);

例如if (String.IsNullOrEmpty(_prefix) ) {...}

这将允许:

  

使用迁移历史记录表,而不删除它

但这不允许使用Migration,而不是所有前缀,默认值除外。

PS:使用多个DB而不是使用多个模式可能更容易。