实体框架:多对多关系引用相同的实体类型没有连接实体?



我正在学习。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);
}

相关内容

最新更新