EFCore 同一实体的多/一对多关系



我试图在一个对象和同一对象的版本之间建立一个实现。我正在使用EFCore,它将其中一个对象的ID保存到两个字段中。

我的对象如下:

public class Workflow
{
public int WorkflowId { get; set; }
[ForeignKey("Parent")]
public int? ParentId { get; set; }
public virtual Workflow Parent { get; set; }
public virtual List<Workflow> Workflows { get; set; } = new List<Workflow>();
public int InternalSequence { get; set; }
public decimal Quantity { get; set; }
public virtual List<WorkflowVersionLink> VersionLinks { get; set; } = new List<WorkflowVersionLink>();
}

public class WorkflowVersionLink
{
public int WorkflowVersionLinkId { get; set; }
public int? IsVersionOfId { get; set; }
public virtual Workflow IsVersionOf { get; set; }
public int? VersionId { get; set; }
public virtual Workflow Version { get; set; }
public bool IsLive { get; set; }
}

我正在设置OnModelCreate,如下所示:

//All of my attempts have used this:
modelBuilder.Entity<WorkflowVersionLink>()
.HasKey(t => new { t.IsVersionOfId, t.VersionId });

//Attempt one: No manual configuration

//Attempt two:
modelBuilder.Entity<WorkflowVersionLink>()
.HasOne(lk => lk.Version)
.WithMany(wf => wf.VersionLinks)
.HasForeignKey(lk => lk.VersionId);

//Attempt three (following info from SO):
modelBuilder.Entity<WorkflowVersionLink>()
.HasOne(lk => lk.IsVersionOf)
.WithMany()
.HasForeignKey(lk => lk.IsVersionOfId)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<WorkflowVersionLink>()
.HasOne(lk => lk.Version)
.WithMany(wf => wf.VersionLinks)
.HasForeignKey(lk => lk.VersionId);

我已经在这里尝试了这种方法: 多对多自引用关系和上面提到的其他方法。

我愿意更改为结构,在所有这些之前,我没有使用 WorkflowVersionLink 对象,而只是一个列表版本,但是这也失败了,因为我已经有一个子工作流列表(我需要保留(

如您所见,我曾尝试自己解决此问题,但现在我陷入困境并决定转向StackOverflow。

您可以在此处查看数据库结果:(我 100% 确定每次运行代码时都添加了两个没有 ID 的全新对象( 数据库结果

我在这里做错了什么?

谢谢

我会特别确定您在WorkflowVersionLink对象中为版本和isVersionOf创建新对象。如果您尝试制作一个对象的副本,则可能会错误地引用同一对象。

modelBuilder.Entity<WorkflowVersionLink>()
.HasKey(t => t.WorkflowVersionLinkId );

modelBuilder.Entity<WorkflowVersionLink>()
.HasOne(lk => lk.Version)
.WithMany(wf => wf.VersionLinks)
.HasForeignKey(lk => lk.VersionId);
modelBuilder.Entity<WorkflowVersionLink>()
.HasOne(lk => lk.IsVersionOf)
.HasForeignKey(lk => lk.IsVersionOfId)

您可能仍需要添加约束以保持数据库干净

最新更新