C#EntityFramework .NETCore 2.0多对多

时间:2018-05-02 16:12:17

标签: c# .net-core many-to-many entity-framework-core

..您好我知道已经有很多问题,但无论如何都无法做到。 我需要一个多对多的自定义连接表,但每次我尝试获取集合时它仍然是空的。

头等舱:

public class Test1 {

    [Key]
    public int id { get; set; }

    public virtual ICollection<TestToTest> others { get; set; }

    public Test1() {
        others = new HashSet<TestToTest>();
    }
}

第二个:

public class Test2 {

    [Key]
    public int id { get; set; }

    public virtual ICollection<TestToTest> others { get; set; }

    public Test2() {
        others = new HashSet<TestToTest>();
    }

}

和联接表:

public class TestToTest {

    [Key]
    public int id { get; set; }

    [ForeignKey("Test1")]
    public int test1Id { get; set; }

    [ForeignKey("Test2")]
    public int test2Id { get; set; }

    public virtual Test1 test1 { get; set; }
    public virtual Test2 test2 { get; set; }

}

但是当我尝试使用以下查询获取其中一个时:

var cont = new MyContext(); //DbContext
Test1 t1 = cont.test1.Find(1); // Fetches first class ok
var tt = t1.others; // Empty array

我真的不知道在其他地方我还缺少什么才能让它发挥作用。 如果我在上下文中添加一个新的,那就没关系...只要它被缓存 - &gt;它确实将行写入db。但重启后(上下文中没有任何缓存),字段'others'始终为空。

感谢您提前提供任何帮助。

1 个答案:

答案 0 :(得分:3)

由于为Eager Loading设置了子关系,因此无法加载。 Eager loading是对一种类型的实体的查询也将相关实体作为查询的一部分加载的过程,因此我们不需要为相关实体执行单独的查询。使用Include()方法实现了预先加载。因此,如果关系实体未使用include加载,则 NOT 将被加载。

将代码更改为

Test1 t1 = cont.test1.Include(t => t.others).SingleOrDefault(t => t.id == 1); 

您可以在this Microsoft文档中阅读Eager Loading