当我尝试创建迁移时,实体框架抛出错误
无法确定类型'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在其注释中共享的link,则会注意到您需要指定谁是主体端,谁是从属端。当您要创建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);