EF Core 2自有实体的PK名称未存储在ModelSnapshot中

时间:2018-04-12 13:20:31

标签: c# entity-framework asp.net-core .net-core entity-framework-core

我目前在ASP.NET Core应用程序中使用带有EF Core 2.0的Npgsql提供程序。

我已将所有表/列/关系名称转换为snake case,以符合Postgres约定,并使代码中的本机语句更容易编写。

此生成的迁移生成正常,但拥有的类型主键未记录在ModelSnapshot中,因此每次生成新迁移时,它都会尝试将PK从PK_foo重命名为pk_foo,即使它已经是数据库本身的pk_foo。除非删除违规行,否则此迁移显然会失败。

有没有办法覆盖这个?或者解决方法是让它不是一个拥有的实体?

这是部分OnModelCreating代码:

builder.Entity<Foo>()
    .OwnsOne(t => t.Bar)
    .ToTable("bar")
    .OnDelete(DeleteBehavior.Cascade);

foreach (var entity in builder.Model.GetEntityTypes())
{
    entity.Relational().TableName = entity.Relational().TableName.ToSnakeCase();

    foreach (var property in entity.GetProperties())
    {
        property.Relational().ColumnName = property.Name.ToSnakeCase();
    }

    foreach (var key in entity.GetKeys())
    {
        key.Relational().Name = key.Relational().Name.ToSnakeCase();
    }

    foreach (var key in entity.GetForeignKeys())
    {
        key.Relational().Name = key.Relational().Name.ToSnakeCase();
    }

    foreach (var index in entity.GetIndexes())
    {
        index.Relational().Name = index.Relational().Name.ToSnakeCase();
    }
}

这是创建的迁移:

migrationBuilder.CreateTable(
    name: "bar",
    columns: table => new
    {
        foo_id = table.Column<int>(nullable: false),
        data = table.Column<byte[]>(nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("pk_bar", x => x.foo_id);
        table.ForeignKey(
            name: "fk_bar_foo_foo_id",
            column: x => x.foo_id,
            principalTable: "foo",
            principalColumn: "id",
            onDelete: ReferentialAction.Cascade);
});

这是模型快照的相关部分

modelBuilder.Entity("ExampleProject.Foo", b =>
{
    b.OwnsOne("ExampleProject.Bar", "Bar", b1 =>
        {
            b1.Property<int>("FooId")
                .HasColumnName("foo_id");

            b1.Property<byte[]>("Data")
                .HasColumnName("data");

            b1.ToTable("bar");

            b1.HasOne("ExampleProject.Foo")
                .WithOne("Bar")
                .HasForeignKey("ExampleProject.Bar", "FooId")
                .HasConstraintName("fk_bar_foo_foo_id")
                .OnDelete(DeleteBehavior.Cascade);
        });
});

EF Core版本:2.0 数据库提供程序:Npgsql 操作系统:Windows 10 IDE:Visual Studio 2017 15.3.4

2 个答案:

答案 0 :(得分:1)

似乎没有解决方法。我已添加到EF Core Issue Tracker here。现在我已经更改了Bar实体,因此它现在不是Foo的拥有对象。

答案 1 :(得分:0)

由@Brice Lambson评论。无法从ModelBuilder API中解决主键名称。

我可以看到配置它的唯一方法是下拉到元数据:

b1.Metadata.DeclaringEntityType
    .GetOrSetPrimaryKey(b1.Property("FooId").Metadata)
    .Relational().Name = "pk_bar";

此问题已添加到Backlog