C # EntityFramework .NETCore 2.0 Многие ко многим - PullRequest
0 голосов
/ 02 мая 2018

.. Здравствуйте, я знаю, что уже было много вопросов по этому поводу, но все равно не могу понять это правильно, несмотря ни на что. Мне нужно много ко многим с пользовательской таблицей соединений, но каждый раз, когда я пытаюсь получить коллекцию, она все еще пуста.

Первый класс:

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

Я действительно понятия не имею, что еще мне там не хватает, чтобы заставить его работать. Если я добавлю новый в контекст, тогда все будет в порядке ... до тех пор, пока он кешируется -> и записывает строку в БД. Но после перезапуска (без какого-либо кеша в контексте) поле «другие» всегда пустое.

Спасибо за любую помощь заранее.

1 Ответ

0 голосов
/ 02 мая 2018

Не загружается, так как дочерние отношения настроены для Eager Loading. Eager loading - это процесс, при котором запрос для одного типа объекта также загружает связанные объекты как часть запроса, поэтому нам не нужно выполнять отдельный запрос для связанных объектов. Стремительная загрузка достигается с помощью метода Include (). Таким образом, если объект отношения не загружается с использованием include, он будет NOT загружен.

Измените код на

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

Вы можете прочитать о Eager Loading в этом документе Microsoft.

...