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

时间:2015-08-25 12:54:25

标签: c# entity-framework

我有以下实体:

public class Revision
{
    public int Id { get; set; }
    ...
    public int? PreviousRevisionId { get; set; }
    public virtual Revision PreviousRevision { get; set; }
}

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

我试过了:

HasOptional(c => c.PreviousRevision)
    .WithOptionalDependent()
    .Map(m => m.MapKey("PreviousRevisionId"));

,但正在进行迁移我收到错误:

  

PreviousRevisionId:Name:类型中的每个属性名称必须是唯一的。   物业名称' PreviousRevisionId'已定义。

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

2 个答案:

答案 0 :(得分:3)

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

所以,你有两个选择:

  • 您可以按照以前的方式映射您的一对一关系,但是 您需要删除PreviousRevisionId属性:

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

    HasOptional(c => c.PreviousRevision).WithMany().HasForeignKey(p => p.PreviousRevisionId);
    

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

答案 1 :(得分:0)

请尝试以下代码:

public class Revision
{
    public int Id { get; set; }
    ...
    public int? PreviousRevisionId { get; set; }
    public virtual Revision PreviousRevision { get; set; }
    public virtual ICollection<Revision > PreviousRevisions { get; set; }
}

和映射:

HasMany(a => a.PreviousRevisions).WithOptional(p => p.PreviousRevision ).HasForeignKey(p => p.PreviousRevisionId )