【问题标题】:EFCore Many/One to Many relationship of the same entity同一实体的 EFCore 多/一对多关系
【发布时间】:2018-08-29 21:46:16
【问题描述】:

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

我已经尝试过这里的方法: Many-to-many self referencing relationship 和上面提到的其他方法。

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

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

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

我在这里做错了什么?

谢谢

【问题讨论】:

  • 您是否尝试使用WorkflowVersionLinkId 作为键并在t.IsVersionOfId, t.VersionId 上添加唯一约束
  • 我假设 WorkflowVersionLink 对象的链接是问题所在。
  • 如果你没有使用标准的 POCO Id,应该使用 builder.Entity().HasKey(x => x.[keyproperty]);
  • @RichardHubley 我不确定你的意思
  • @CarlosCocom 我已经这样做了,不是吗?

标签: c# entity-framework-core


【解决方案1】:

我会更加确定您正在 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)

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

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多