我正在尝试在一个对象和同一对象的版本之间建立一种关系。我正在使用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
我在这里做什么错了?
谢谢
答案 0 :(得分:0)
我将特别确定您要在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)
您可能仍需要添加约束以保持数据库干净