我正在学习。net和实体框架,并试图在EF中创建一个多对多关系,其中关系(实际上是两种不同的关系)是具有相同类型的实体。
每个教育单位可以有一个相等的教育单位列表。每个教学单元可以有一个必修教学单元列表。
下面是类:
public class EducationalUnit : IAutoAssignable
{
public Guid Id { get; init; }
public string Title {get; set;}
public bool HasAutoAssign {get; set;}
public bool IsTopLevel {get; set;}
public int OrderInParent {get; set;}
public double Duration {get; set;}
public List<EducationalUnit>? Prerequisites {get; set;}
public List<EducationalUnit>? Equivalents {get; set;}
public List<Enrollment>? Enrollments {get; set;}
public List<Competency>? Competencies {get; set;}
public List<Tag>? Tags {get; set;}
public string Type {get; set;}
public string AssignmentLogicString {get; set;}
public User CreatedBy {get; set;}
public User Owner {get; set;}
}
我正在努力寻找如何在EF中实现这一点的方法。这里的方法是为这些关系创建两个连接实体(如下所示)并在DB中创建两个连接表吗?对于这些类型的关系有没有最佳实践?
public class Equivalent
{
public EducationalUnit EducationalUnitOne {get; set;}
public EducationalUnit EducationalUnitTwo {get; set;}
}
public class Prerequisite
{
public EducationalUnit MainEduationalUnit {get; set;}
public EducationalUnit PrerequisiteEducationalUnit {get; set;}
}
从EF Core 7开始,支持阴影属性导航。你可以这样配置导航:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<EducationalUnit>()
.HasMany(u => u.Prerequisites)
.WithMany("Mains");
var manyMany = modelBuilder.Entity<EducationalUnit>()
.HasMany(u => u.Equivalents)
.WithMany("Equivalents1");
}
在EF Core 6/5中,不支持阴影导航属性。您需要为导航属性定义一个CLR属性,例如:
public class EducationalUnit
{
public int Id { get; init; }
...
public List<EducationalUnit>? Prerequisites { get; set; }
public List<EducationalUnit>? NeededTo { get; set; }
public List<EducationalUnit>? Equivalents { get; set; }
public List<EducationalUnit>? Equivalents1 { get; set; }
}
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<EducationalUnit>()
.HasMany(u => u.Prerequisites)
.WithMany(u => u.NeededTo);
modelBuilder.Entity<EducationalUnit>()
.HasMany(u => u.Equivalents)
.WithMany(u => u.Equivalents1);
}