在 EF 代码首次迁移中使用模式

Working with Schemas in EF Code First Migrations

我想这个问题是一个表面问题;当您最初创建 EF 迁移时,默认情况下它会放入架构;例如:

public override void Up()
{            
    DropPrimaryKey("dbo.MyTable");

    AddPrimaryKey("dbo.MyTable", "NewField");

这看起来不错,你会看到它生成的键名(键名中有 dbo)。

我意识到解决这个问题的一种方法是直接指定键名。是否还有其他选项,例如可以为块指定模式,但不包含在特定修改中?例如:

public override void Up()
{            
    UseSchema("dbo");
    DropPrimaryKey("MyTable");

    AddPrimaryKey("MyTable", "NewField");

我知道您可以简单地省略架构名称;即,这将起作用:

public override void Up()
{            
    DropPrimaryKey("MyTable");

    AddPrimaryKey("MyTable", "NewField");

但是我将如何处理不止一个模式的情况?

您可以在 DbModelBuilder class 实例上使用 HasDefaultSchema 方法指定默认架构。

modelBuilder.HasDefaultSchema("schemaName");

您还可以在 EntityTypeConfiguration<TEntityType> class 实例上使用 ToTable 方法为每个实体设置架构。这将为所需 entity/ies.

生成具有提供架构的迁移脚本
modelBuilder.Entity<TEntity>().ToTable("tableName", "schemaName")

您还可以使用 Table 属性来设置实体的架构。

[Table("tableName","schemaName")]

或者您可以编写自己的自定义约定

public class DynamicSchemaConvention : Convention
{
    public CustomSchemaConvention()
    {
        Types().Configure(c => c.ToTable(c.ClrType.Name, c.ClrType.Namespace.Substring(c.ClrType.Namespace.LastIndexOf('.') + 1)));
    }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Conventions.Add(new CustomSchemaConvention());
}

相关链接:

DbModelBuilder.HasDefaultSchema Method

EntityTypeConfiguration.ToTable Method

TableAttribute Class

Entity Framework Custom Code First Conventions (EF6 onwards)