实体框架和在单个上下文中具有多个模式的迁移

Bru*_*uza 5 c# entity-framework ef-code-first entity-framework-6

我正在使用实体框架代码优先开发多租户应用程序。每个租户在数据库中都有不同的架构,但应用程序将为所有租户提供单一的上下文和模型。

\n\n

Entity Framwork 6 能够在同一个数据库中使用具有多个上下文的多个模式,但我没有找到在单个上下文中使用多个模式的方法。

\n\n

我已(通过命令行)生成了到默认 \xe2\x80\x9cdbo\xe2\x80\x9d 架构的迁移。我想使用这些迁移来更新其他架构。

\n

Rob*_*etz 2

虽然我同意多个上下文绝对是更好的方法(也是我设置自己的项目的方式),但我想回答您最初的问题:如何在单个上下文中使用多个模式:

在每个模型的映射配置内部,您可以调用“ToTable(myTableName, mySchema)”来修改表所属的架构:

public class MyEntityMap : EntityTypeConfiguration<MyEntity>
{
    public MyEntityMap ()
    {
        HasKey(t => t.MyId);
        Property(t => t.MyId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        ToTable("MyEntity", "MySchema");
    }
}
Run Code Online (Sandbox Code Playgroud)

这将允许您单独设置每个表的架构,同时维护单个上下文。

由于您声明您希望在不同的模式中使用相同的模型,这使得在不了解更多有关您的设置的情况下变得更加困难。如果您只与少数客户打交道,并且不介意在代码中维护他们的架构,那么您可以简单地为每个架构创建一个映射(如上所述),然后为每个客户添加一个新的 DbSet。如果您试图使其扩展到大量客户,那么我强烈建议您考虑一种不同的方法,因为当您的 dba 看到不同模式中的 100 多个相同的表而不是在每个表上使用 customerID 列时,他可能会尖叫。