在EF Code First Migrations中使用Schema

时间:2018-01-08 14:34:26

标签: entity-framework ef-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");

但是,我如何处理存在多个架构的情况呢?

1 个答案:

答案 0 :(得分:1)

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

modelBuilder.HasDefaultSchema("schemaName");

您还可以使用ToTable类实例上的EntityTypeConfiguration<TEntityType>方法为每个实体设置架构。这将生成具有所需实体的提供架构的迁移脚本。

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 6 - Code First: table schema from classes' namespace

Entity Framework Custom Code First Conventions (EF6 onwards)