EFCore Многие / Один ко многим отношения одного и того же лица - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь установить отношения между объектом и версиями одного и того же объекта. Я использую EFCore и сохраняю идентификатор одного из объектов в обоих полях.

Мои объекты выглядят следующим образом:

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%, что я добавил два совершенно новых объекта, у которых не было идентификаторов каждый раз, когда я запускал код) результат базы данных

Что я здесь не так делаю?

Спасибо

1 Ответ

0 голосов
/ 29 августа 2018

Я был бы уверен, что вы создаете новые объекты для Version и isVersionOf в вашем объекте WorkflowVersionLink. Если вы пытаетесь сделать копию одного из них, возможно, вы ошибочно ссылаетесь на один и тот же объект.

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)

Возможно, вам все еще потребуется добавить ограничения, чтобы поддерживать чистоту вашей базы данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...