使用具有恒定值的外键的地图集合

问题描述 投票:0回答:2

我设计的表可以包含多个表(StudentsTeachers)中的记录的参数(Parameters)。

作为参数表上的外键,我正在使用一个枚举(StudentTeacher),该枚举按列与来自多个表的主键配对。

如何用参数表中的记录填充对象集合(Student.ParametersTeacher.Parameters)?

我将尝试解释一个简单的学校例子。

EF核心代码优先DB上下文:

class Student
{
   [Key]
   public Guid Id { get; set; }
   public IList<Parameter> Parameters { get; set; } 
}
class Teacher
{
   [Key]
   public Guid Id { get; set; }
   public IList<Parameter> Parameters { get; set; } 
}
enum EntityType
{
   Student,
   Teacher
}
class Parameter
{
   [Key]
   public Guid Id { get; set; }
   public EntityType EntityType { get; set; }
   public Guid EntityId { get; set; }
   public string Value { get; set; }
}
class SchoolDbContext : DbContext
{
   public DbSet<Student> Students { get; set; }
   public DbSet<Teacher> Teachers { get; set; }
   public DbSet<Parameter> Parameters { get; set; }

   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
      modelBuilder.Entity<Parameter>()
          .HasKey(prm => new { prm.EntityType, prm.EntityId });
   }
}

要填充Teacher对象的Parameters集合(也包括Student.Parameters),我希望应用程序执行如下SQL:

SELECT prm.*
  FROM Teachers tch
  LEFT JOIN Parameters prm
    ON prm.EntityType = 'Teacher'
   AND prm.EntityId = tch.Id
 WHERE tch.Id = @id

要像这样使用它(如果可能的话,也可以级联删除):

Guid studentId = .....;
var student = SchoolDbContext.Students
   .Include(s => s.Parameters)
   .Find(studentId);
c# entity-framework .net-core ef-code-first ef-core-3.0
2个回答
0
投票

您可以这样使用

class Student
{
   [Key]
   public Guid Id { get; set; }

   // add virtual
   public virtual IList<Parameter> Parameters { get; set; } 
}
class Teacher
{
   [Key]
   public Guid Id { get; set; }
   // add virtual
   public virtual IList<Parameter> Parameters { get; set; } 
}
enum EntityType
{
   Student,
   Teacher
}
class Parameter
{
   [Key]
   public Guid Id { get; set; }
   public EntityType EntityType { get; set; }
   public Guid EntityId { get; set; }
   public string Value { get; set; }

   [ForeignKey("Student")]
   public Guid StudentId { get; set; }
   [ForeignKey("Teacher")]
   public Guid TeacherId { get; set; }
}

希望这对您有帮助


0
投票

您可以这样操作,并在每个层次结构策略中使用一个表吗? https://entityframework.net/tph

enum EntityType
{
   Student,
   Teacher
}
class Person
{
    public Guid Id {get;set;}
    public EntityType EntityType { get; set; }
    public IList<Parameter> Parameters { get; set; } 
}
class Student : Person
{

}
class Teacher : Person
{

}
class Parameter
{
   [Key]
   public Guid Id { get; set; }
   public Guid PersonId { get; set; }
   public string Value { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.