我有一个已经与底层数据库一起使用的实体,它只使用导航属性创建一个可选实体(1:0..1)。因此,默认约定,EF根据该约定在DB中创建了一个可为空的外键列,并为其指定了带有下划线的“MyProp_Id”名称。
现在,我希望将该外键作为实体的属性公开,因为它会使某些场景更容易。我不想重命名/更改DB中的基础外键列(MyProp_Id)。实际上,不应该有任何底层数据库更新,我只想在实体上公开FK。一个代码示例澄清:
public class MyEntityA
{
public long Id { get; set; }
//public long? MyOptionalEntityB_Id { get; set; } <== this is what I am trying to add
//public long? MyOptionalEntityBId { get; set; } <== this didn't work either
public MyEntityB MyOptionalEntityB { get; set; }
}
我只是尝试在实体上添加“MyOptionalEntity_Id”属性作为属性,希望EF“自动”看到它,因为名称相同,它只是映射并且开心。没有骰子。
然后我尝试将我的属性命名为“MyOptionalEntityId”(没有下划线),但仍然没有骰子。
然后我尝试添加一个显式映射配置来说:
this.Property(p => p.MyOptionalEntityId).HasColumnName("MyOptionalEntity_Id");
没有骰子
有办法做到这一点吗?这是清楚有意义吗?
答案 0 :(得分:2)
public long? MyOptionalEntityB_Id { get; set; }
[ForeignKey("MyOptionalEntityB_Id")]
public MyEntityB MyOptionalEntityB { get; set; }
或使用fluent api。
modelBuilder.Entity<MyEntityA >()
.HasOptional(x => x.MyOptionalEntityB)
.WithMany().HasForeignKey(x => x.MyOptionalEntityB_Id);
// ^^^ -> if MyEntityB has collection of MyEntityA, mention it