繁体   English   中英

实体框架中的双重自引用

[英]Double self referencing in Entity Framework

当我尝试创建迁移时,实体框架抛出错误

无法确定类型'WorkFlowState'和'WorkFlowState'之间的关联的主要终点。 必须使用关系流利的API或数据注释显式配置此关联的主要端。

码:

public class WorkFlowState
{
    public Guid Id { get; set; }

    public virtual WorkFlowState NextState { get; set; }
    public virtual WorkFlowState PrevState { get; set; }
}

我该怎么办?

更新1:人们在说这个问题是重复的问题,但是如果您看一下已接受的答案( octavioccl提供的第三个选项),您会发现它有何不同。

问题是EF尝试按照约定配置一对一关系。 如果检查@Michael在其注释中共享的链接 ,您会注意到您需要指定谁是主要端,谁是从属端。 当您要创建WorkflowState的新实例时,必须始终设置主体端。 现在,如果您需要配置一对一关系,您会发现该链接具有两个选项:

选项1:指定关系的FK

public class WorkFlowState
{
     public Guid Id { get; set; }

     [Key,ForeignKey("PrevState")]
     public Guid PrevStateId { get; set; }
     public virtual WorkFlowState NextState { get; set; }
     public virtual WorkFlowState PrevState { get; set; }
}

选项2:使用必需的数据批注:

public class WorkFlowState
{
     public Guid Id { get; set; }

     public virtual WorkFlowState NextState { get; set; }
     [Required]
     public virtual WorkFlowState PrevState { get; set; }
}

但是如果您需要将两个引用都作为可选引用,则还有第三种选择:

public class WorkFlowState
{
     public Guid Id { get; set; }

     [ForeignKey("PrevState")]
     public Guid? PrevStateId { get; set; }

     [ForeignKey("NextState")]
     public Guid? NextStateId { get; set; }

     public virtual WorkFlowState NextState { get; set; }
     public virtual WorkFlowState PrevState { get; set; }
}

在这种情况下,您将创建两个单向关系。 为了帮助您更好地了解在后一种情况下发生的情况,可以通过以下方式对这些关系进行Fluent Api配置:

modelBuilder.Entity<WorkFlowState>().HasOptional(t => t.NextState).WithMany().HasForeignKey(t => t.NextStateId);
modelBuilder.Entity<WorkFlowState>().HasOptional(t => t.PrevState).WithMany().HasForeignKey(t => t.PrevStateId);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM