如何使用EF6 Code First将Foreign Key属性公开给具有导航属性的现有实体

时间:2014-07-31 14:22:58

标签: c# entity-framework ef-code-first

我有一个已经与底层数据库一起使用的实体,它只使用导航属性创建一个可选实体(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");

没有骰子

有办法做到这一点吗?这是清楚有意义吗?

1 个答案:

答案 0 :(得分:2)

尝试添加foreign key attribute

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