Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架中的双重自引用_C#_Entity Framework - Fatal编程技术网

C# 实体框架中的双重自引用

C# 实体框架中的双重自引用,c#,entity-framework,C#,Entity Framework,当我尝试创建迁移时,Entity Framework会抛出一个错误 无法确定类型“WorkFlowState”和“WorkFlowState”之间关联的主体端。必须使用关系fluent API或数据注释显式配置此关联的主体端 代码: 我该怎么办 更新1: 人们说这个问题是一种重复的问题,但如果你看一看被接受的答案(octavioccl提供的第三个选项),你就会发现它有什么不同。问题是EF试图按照约定配置一对一的关系。如果您检查@Michael在其评论中共享的,您会注意到您需要指定谁是主端,谁是从

当我尝试创建迁移时,Entity Framework会抛出一个错误

无法确定类型“WorkFlowState”和“WorkFlowState”之间关联的主体端。必须使用关系fluent API或数据注释显式配置此关联的主体端

代码:

我该怎么办

更新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; }
}
在本例中,您将创建两个单向关系。为了帮助您更好地理解最后一种情况下发生的情况,这些关系的配置如下:

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

有很多类似的问题,所以,.Wow,我使用了第三个选项,效果很好!:)世界上有几个很棒的人,你就是其中之一!我从你身上学到了很多。。。谢谢
modelBuilder.Entity<WorkFlowState>().HasOptional(t => t.NextState).WithMany().HasForeignKey(t => t.NextStateId);
modelBuilder.Entity<WorkFlowState>().HasOptional(t => t.PrevState).WithMany().HasForeignKey(t => t.PrevStateId);