Entity Framework - Main table 具有两个具有不同名称字段的用户,与单个外键字段的关系

Entity Framework - Main table with two users with different name field, relation with a single field of foreign key

我在 .Net Core 2.2 中使用 EF。我不知道如何解决以下问题:

我有 PQL 和 PM 字段,这些字段是用户的键(基于 table 用户)。 那么,我如何使用 EF...

创建两个字段与同一字段(在辅助 table 中)的两个关系

例如,一个要求是创建一个查询以获取每个用户的所有项目,其中用户是 PM 或 PQL...

主要table是:

public class ProjectHeader
    {
        [Key]
        public int IdProjectHeader { get; set; }
        [StringLength(200)]
        public string ProjectName { get; set; }

        [ForeignKey("FK_IdUser")]
        [Column("IdUser")]
        public int PM { get; set; }
        [ForeignKey("FK_IdUser")]
        [Column("IdUser")]
        public int PQL { get; set; }

        // NOT LINK WITH USER TABLE CORRECTLY
        public User User { get; set; }
    }

用户 table 是:

public class User
    {
        [Key]
        public int IdUser { get; set; }
        [Required]
        [StringLength(100)]
        public string UserName { get; set; }
        [Required]
        [StringLength(50)]
        public string ShortName { get; set; }
        [Required]
        [StringLength(50)]
        public string Email { get; set; }
    }

A link 到与此类似的问题。我建议您研究并使用 Entity Framework 的 Fluent API。基本上在您的上下文 class(继承 DbContext class)中,您像这样覆盖 OnModelCreating 方法:

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts);
    }
}

在里面你可以为你的数据库配置一些高级关系。你可以查一下here

我解决了问题...在主要 table 我包括:

[ForeignKey("PM")]
public User PmUser { get; set; }
[ForeignKey("PQL")]
public User PqlUser { get; set; }

...对两个字段使用用户实体(使用外键 - 等于主 table 上的字段)... 所以,PM 与 idUser... 匹配,PQL 与 idUser

匹配

现在...当我尝试使用代码优先更新数据库时出现循环引用...

因此,在 class public class ApplicationDbContext : DbContext 中,我覆盖了外键:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<ProjectHeader>().HasOne(m => m.PmUser).WithMany().OnDelete(DeleteBehavior.ClientSetNull);
    modelBuilder.Entity<ProjectHeader>().HasOne(m => m.PqlUser).WithMany().OnDelete(DeleteBehavior.ClientSetNull);
}