【问题标题】:EF6.1 optional-to-optional with fluent api mappingEF6.1 可选到可选,带有流畅的 api 映射
【发布时间】:2015-08-25 12:54:24
【问题描述】:

我有以下实体:

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

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

我试过了:

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

,但是在进行迁移时出现错误:

PreviousRevisionId:名称:类型中的每个属性名称都必须是唯一的。 属性名称“PreviousRevisionId”已定义。

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    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")); 
      
    • 或者您可以创建一个单向的一对多关系:

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

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

    【讨论】:

    • 谢谢,第二个解决方案适合我,但是当我知道它实际上是一对一时,我需要将关系定义为一对多,这看起来很奇怪。
    【解决方案2】:

    请试试这个代码:

    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 )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多