C# 未存储在ModelSnapshot中的所属实体的EF Core 2自定义主键名称

C# 未存储在ModelSnapshot中的所属实体的EF Core 2自定义主键名称,c#,entity-framework,asp.net-core,.net-core,entity-framework-core,C#,Entity Framework,Asp.net Core,.net Core,Entity Framework Core,我目前正在ASP.NET核心应用程序中使用带有EF Core 2.0的Npgsql提供程序 我已经将所有表/列/关系名称转换为snake-case,以便符合Postgres约定,并且更容易在代码中编写本机语句 此迁移生成的很好,但拥有的类型主键没有记录在ModelSnapshot中,因此每次生成新迁移时,它都会尝试将PK从PK_foo重命名为PK_foo,即使它在数据库本身中已经是PK_foo。除非删除违规行,否则此迁移显然将失败 有什么方法可以推翻这一点吗?或者解决办法是让它不是一个拥有的实体

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

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

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

有什么方法可以推翻这一点吗?或者解决办法是让它不是一个拥有的实体

这是部分onmodel创建代码:

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();
    }
}
builder.Entity()
.OwnsOne(t=>t.Bar)
.ToTable(“bar”)
.OnDelete(DeleteBehavior.Cascade);
foreach(builder.Model.GetEntityTypes()中的var实体)
{
entity.Relational().TableName=entity.Relational().TableName.ToSnakeCase();
foreach(entity.GetProperties()中的var属性)
{
property.Relational().ColumnName=property.Name.ToSnakeCase();
}
foreach(entity.GetKeys()中的var键)
{
key.Relational().Name=key.Relational().Name.ToSnakeCase();
}
foreach(entity.GetForeignKeys()中的var键)
{
key.Relational().Name=key.Relational().Name.ToSnakeCase();
}
foreach(entity.GetIndexes()中的var索引)
{
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);
});
migrationBuilder.CreateTable(
名称:“酒吧”,
列:表=>new
{
foo_id=table.Column(可空:false),
data=table.Column(可空:true)
},
约束:表=>
{
表.PrimaryKey(“pk_-bar”,x=>x.foo_-id);
表1.外键(
名称:“fk_bar_foo_foo_id”,
列:x=>x.foo_id,
原则:“foo”,
主栏:“id”,
onDelete:引用。级联);
});
这是模型快照的相关部分

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);
        });
});
modelBuilder.Entity(“ExampleProject.Foo”,b=>
{
b、 OwnsOne(“ExampleProject.Bar”,“Bar”,b1=>
{
b1.财产(“食品”)
.HasColumnName(“foo_id”);
b1.财产(“数据”)
.HasColumnName(“数据”);
b1.可折叠(“棒材”);
b1.HasOne(“ExampleProject.Foo”)
.带一个(“Bar”)
.HasForeignKey(“ExampleProject.Bar”、“FooId”)
.hassconstraintname(“fk_bar_foo_foo_id”)
.OnDelete(DeleteBehavior.Cascade);
});
});
EF核心版本:2.0 数据库提供程序:Npgsql 操作系统:Windows 10
IDE:Visual Studio 2017 15.3.4

似乎没有解决此问题的方法。我已经添加到EF核心问题跟踪程序中。目前,我已经更改了Bar实体,因此它现在不是Foo拥有的对象。

正如@Brice Lambson所评论的那样。无法从ModelBuilder API中寻址主键名称

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

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

问题已添加到。

您可以在PK上使用
数据批注。由于这是一个自有实体,因此代码中没有PK。Bar实体只是“公共类Bar{public byte[]Data{get;set;}}”,您可以尝试
[Column(“pk_foo”)]
pk_foo
@Bonnotbh在使用SqlServer的EFC2.0.2中也会发生同样的情况,因此我假设这是一个常见问题。考虑把它发布到他们的问题跟踪器,我看不到任何解决办法。