繁体   English   中英

EFCore同一实体的多对多关系

[英]EFCore Many/One to Many relationship of the same entity

我试图在一个对象和同一对象的版本之间建立一种关系。 我正在使用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; }
}

我正在按如下方式设置OnModelCreating:

//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对象中为Version和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)

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

暂无
暂无

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

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