我设计的表可以包含多个表(Students,Teachers)中的记录的参数(Parameters)。
作为参数表上的外键,我正在使用一个枚举(Student,Teacher),该枚举按列与来自多个表的主键配对。
如何用参数表中的记录填充对象集合(Student.Parameters,Teacher.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);
您可以这样使用
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; }
}
希望这对您有帮助
您可以这样操作,并在每个层次结构策略中使用一个表吗? 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; }
}