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