EF6.1可选 - 可选,具有流畅的api映射

drt*_*rty 5 c# entity-framework

我有以下实体:

public class Revision
{
    public int Id { get; set; }
    ...
    public int? PreviousRevisionId { get; set; }
    public virtual Revision PreviousRevision { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我需要的是使用PreviousRevision导航属性和PreviousRevisionId作为它的外键ID 在同一实体中创建可选 - 可选关系.我知道可以通过PreviousRevisionId使用[ForeignKey("PreviousRevision")]属性注释属性来完成,但是流畅的api呢?

我试过了:

HasOptional(c => c.PreviousRevision)
    .WithOptionalDependent()
    .Map(m => m.MapKey("PreviousRevisionId"));
Run Code Online (Sandbox Code Playgroud)

,但做迁移我收到错误:

PreviousRevisionId:Name:类型中的每个属性名称必须是唯一的.已定义属性名称"PreviousRevisionId".

所以,基本上,使用流畅的API看起来是不可能的.但我认为注释功能是流畅的API功能的子集,不是吗?

oct*_*ccl 4

MapKey当您不希望将外键作为模型类中的属性并且希望重命名 EF 在数据库中默认提供的 FK 列名称时,可以使用。

所以,你有两个选择:

  • 您可以像之前尝试的那样映射一对一关系,但需要删除PreviousRevisionId属性:

    HasOptional(c => c.PreviousRevision).WithOptionalDependent();// If you want now you can rename the FK column using .Map(m => m.MapKey("PreviousRevisionId")); 
    
    Run Code Online (Sandbox Code Playgroud)
  • 或者您可以创建单向一对多关系:

    HasOptional(c => c.PreviousRevision).WithMany().HasForeignKey(p => p.PreviousRevisionId);
    
    Run Code Online (Sandbox Code Playgroud)

我认为最后一个选项更适合您想要实现的目标。