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);
}
我在 .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);
}