EntityFramework外键作为主键,具有流畅的API

时间:2016-02-02 16:46:17

标签: c# entity-framework

我试图在两个实体之间创建一个必需的:可选关系,其中所需的实体将导航属性暴露给可选实体,以及包含外键的可选实体,用作其主键。这就是我的两个实体:

class OptionalEntity
{
  public string RequiredEntityID { get; set; }
}

class RequiredEntity
{
  public string ID { get; set; }
  public OptionalEntity Optional { get; set; }
}

我希望喜欢在流畅的API中配置它们的方式如下:

// Inside OptionalEntityConfiguration class
public OptionalEntityConfiguration()
{
  HasKey(r => r.RequiredEntityID);
}

// Inside RequiredEntityConfiguration class
public RequiredEntityConfiguration()
{
  HasKey(r => r.ID);
  HasOptional(r => r.Optional)
    .WithRequired();

  //  How can I configure this relationship to use
  //    the RequiredEntityID property as the foreign key?

  HasOptional(r => r.Optional)
    .WithRequired(o => o.RequiredEntityID);
  //  This is invalid because it requires a navigation property, not an ID

  HasOptional(r => r.Optional)
    .WithRequired()
    .HasForeignKey(o => o.RequiredEntityID);
  //  The HasForeignKey method isn't available here
}

首先这是可能的,如果是这样,使用流畅的API配置此关系的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

我认为您要做的是使用Optional Entity表上的Required Entity上使用的相同密钥,以便它们共享相同的密钥。

如果是这种情况,我认为你走在正确的轨道上。你的实体类看起来没问题。您可以像这样映射它们:

public OptionalEntityConfiguration()
{
   HasKey(r => r.RequiredEntityID);
   Property(r => r.RequiredEntityID)
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}

public RequiredEntityConfiguration()
{
   HasKey(r => r.ID);
   HasOptional(r => r.Optional);
}

然而,这意味着每个OptionalEntity只能有0或1 RequiredEntity

答案 1 :(得分:0)

试试这个:

modelBuilder.Entity<RequiredEntity>()
            .HasOptional(o => o.Optional)
            .WithMany()
            .Map(m => m.MapKey("RequiredEntityID"));