0

我有一个 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”之间已经存在关系。导航属性只能参与单个关系。

我尝试了这个老问题的解决方案,但无法使它们中的任何一个起作用。

有没有另一种方法可以同时跟踪 aProject的创建者和所有者,并能够.Include()在查询中同时跟踪它们?

4

2 回答 2

0

不要使用不同的绑定,而是使用单个绑定

modelBuilder.Entity<ApplicationUser>()
.HasMany(p => p.Projects)
.WithOne(o => o.ProjectOwner)
.HasForeignKey(po => po.ProjectOwnerId);
.WithOne(c => c.ProjectCreator)
.HasForeignKey(pc => pc.ProjectCreatorId);
于 2020-04-08T12:40:35.047 回答
0

我选择了这个解决方案:

如评论中所述,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);

现在我可以同时包含创建者和所有者。:)

于 2020-04-08T17:39:35.427 回答