Как я могу включить два реляционных свойства одного типа? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть модель ApplicationUser:

public class ApplicationUser : IdentityUser
{
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
    public List<Project> Projects { get; set; }
}

... и модель проекта:

public class Project
{
    public int Id { get; set; }
    public int? ParentProjectId { get; set; }

    [Required]
    public string ProjectCreatorId { get; set; }

    [Required]
    public string ProjectOwnerId { get; set; }

    public string Title { get; set; }
    public DateTime Created { get; set; }

    public ApplicationUser ProjectCreator { get; set; }
    public ApplicationUser ProjectOwner { get; set; }
    public Project ParentProject { get; set; }
    public virtual List<Project> ChildProjects { get; set; }
}

В OnModelCreating(), я пробовал это:

base.OnModelCreating(modelBuilder);

modelBuilder.Entity<Project>()
    .HasMany(c => c.ChildProjects)
    .WithOne(p => p.ParentProject)
    .HasForeignKey(p => p.ParentProjectId);

modelBuilder.Entity<ApplicationUser>()
    .HasMany(p => p.Projects)
    .WithOne(o => o.ProjectOwner)
    .HasForeignKey(po => po.ProjectOwnerId);

modelBuilder.Entity<ApplicationUser>()
    .HasMany(p => p.Projects)
    .WithOne(c => c.ProjectCreator)
    .HasForeignKey(pc => pc.ProjectCreatorId);

Но после создания базы данных я получаю

Невозможно создать связь между ApplicationUser.Projects и Project.ProjectCreator, поскольку между ApplicationUser.Projects и 'Project.ProjectOwner. Свойства навигации могут участвовать только в одной взаимосвязи.

Я пытался решить этот старый вопрос , но не смог заставить ни одну из них работать.

Есть ли другой способ, которым я мог бы отслеживать как создателя И владельца Project, так и иметь возможность .Include() их обоих в запросах?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Я выбрал это решение:

Как уже упоминалось в комментариях, ApplicationUser потребуется два List<Project> свойства:

public List<Project> CreatedProjects { get; set; }
public List<Project> OwnedProjects { get; set; }

Затем в OnModelCreating():

modelBuilder.Entity<Project>()
    .HasOne(g => g.ProjectCreator)
    .WithMany(t => t.CreatedProjects)
    .HasForeignKey(t => t.ProjectCreatorId)
    .HasPrincipalKey(t => t.Id);
modelBuilder.Entity<Project>()
    .HasOne(g => g.ProjectOwner)
    .WithMany(t => t.OwnedProjects)
    .HasForeignKey(t => t.ProjectOwnerId).OnDelete(DeleteBehavior.NoAction)
    .HasPrincipalKey(t => t.Id);

Теперь я могу включать как создателей, так и владельцев. :)

0 голосов
/ 08 апреля 2020

Вместо другой привязки используйте одну привязку

modelBuilder.Entity<ApplicationUser>()
.HasMany(p => p.Projects)
.WithOne(o => o.ProjectOwner)
.HasForeignKey(po => po.ProjectOwnerId);
.WithOne(c => c.ProjectCreator)
.HasForeignKey(pc => pc.ProjectCreatorId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...