我有以下数据模型:
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
表,其中包含Id
和BarId
。从数据库中读取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);
});
答案 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查询中访问它。