使用带有EFCore的私有字段设置自定义外键列名称

时间:2017-12-03 20:27:54

标签: entity-framework-core

我有以下数据模型:

public class Foo
{
    public Foo(int barId)
    {
        BarId = barId;
    }

    private int BarId;
    public Bar Bar { get; private set; }
}

public class FooTypeConfig : IEntityTypeConfiguration<Foo>
{
    public void Configure(EntityTypeBuilder<Foo> builder)
    {
        builder.HasOne(x => x.Bar)
            .WithMany()
            .HasForeignKey("BarId");
    }
}

public class Bar
{
    public int Id { get; private set; }
}

这很有效,根据我的期望,我有Foo表,其中包含IdBarId。从数据库中读取BarId时,我的私有字段Bar和我的Foo属性也正确实现。

问题是我想找到一种方法来命名我的私有字段,并为我的数据库列选择一个不同的名称。我想为我的属性_barId命名,并仍然选择BarId作为我的数据库中的列名。

这可能吗?

我尝试在Foo类中重命名字段,并在_barId

中指定我的(现在非传统命名的)外键EntityTypeConfiguration
builder.HasOne(x => x.Bar).WithMany().HasForeignKey("_barId");

但是这导致EF仍然生成BarId列,而不将其用作Bar表的外键...

migrationBuilder.CreateTable(
    name: "Foos",
    columns: table => new
    {
        Id = table.Column<int>(nullable: false)
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
        BarId = table.Column<int>(nullable: true),
        _barId = table.Column<int>(nullable: false)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Foos", x => x.Id);
        table.ForeignKey(
            name: "FK_Foos_Bars__barId",
            column: x => x._barId,
            principalTable: "Bars",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
    });

react docs

1 个答案:

答案 0 :(得分:5)

首先,EF将数据库列和FK映射到实体属性,而不是字段。这些属性可以是真实的,也可以像您的情况一样 - shadow

以下一行:

builder.HasOne(x => x.Bar).WithMany().HasForeignKey("BarId");

映射Bar - &gt; Foo关系FK与名为Foo的{​​{1}}影子属性关联,并保持不变。

使用BarId方法配置属性类型,支持字段,列名称,类型和其他属性。例如:

Property

确保在定义它时和指定FK时使用同一个属性名称。您还可以使用builder.Property<int>("BarId") // or int? etc. .HasField("_barId") .HasColumnName("BarId"); // or BazId or whatever you like 来获取/设置值,将其标记为已修改等,以及Entry(entity).Property(propertyName))以在LINQ to Entities查询中访问它。