EF Core 3.1 如何在多对多关系中自动映射

Jep*_*sen 4 c# entity-framework asp.net-core

我使用 DB First 方法在 .NET Core 实体框架中构建了一个数据库模型。我的数据库中有几个多对多关系,它们都用一个连接表表示。

就像这样:

public partial class Test1
{
    public Test1()
    {
        Test1_Test2= new HashSet<Test1_Test2>();
    }

    public int Id { get; set; }
    ..

    public virtual ICollection<Test1_Test2> Test1_Test2{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
public partial class Test2
{
    public Test2()
    {
        Test1_Test2= new HashSet<Test1_Test2>();
    }

    public int Id { get; set; }
    ..

    public virtual ICollection<Test1_Test2> Test1_Test2{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
public partial class Test1_Test2
{
    public int Test1Id{ get; set; }
    public int Test2Id{ get; set; }

    public virtual Test1 Test1{ get; set; }
    public virtual Test2 Test2{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

EF 构建了支持这种结构的 Fluent API,在连接表中使用外键和复合主键。

当我要向这种关系中添加某些内容时,这是一种乏味的操作,我必须按照此顺序执行一些操作,以便正确填充我的连接表:

_context.Test1.Add(Test1);
_context.Test2.Add(Test2);
Test1_Test2.Test1 = Test1;
Test1_Test2.Test2 = Test2;
_context.Test1_Test2.Add(Test1_Test2);
_context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

从 .NET Framework 中的旧 EF 中,我记得执行自动映射器功能有点直接,这使我只能执行以下操作:

Test1.Test2 = Test2; 
_context.Test1.Add(Test1);
_context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

这很方便,因为 EF 会计算出如何自动填充连接表。当我必须从这些表中提出请求时,这也方便得多。

因此,如何首先在 .Net Core EF DB 中添加“自动映射器”功能 - 这是否受支持?

Dav*_*oft 6

在 EF Core 3 中,不支持多对多。这是来自旧文档:

多对多

尚不支持没有实体类来表示连接表的多对多关系。但是,您可以通过包含连接表的实体类并映射两个单独的一对多关系来表示多对多关系。

作为部分解决方法,您可以添加NotMapped属性或遍历这两个关系的函数。您只是无法编写涉及 NotMapped 属性的查询。

但它们存在于 EF Core 5:关系 - EF Core - 多对多中