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

Alf*_*and 3 c# entity-framework

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

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

class RequiredEntity
{
  public string ID { get; set; }
  public OptionalEntity Optional { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

而且我会顺便对它们进行配置以流利的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
}
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*rdo 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);
}
Run Code Online (Sandbox Code Playgroud)

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