Страницы

Поиск по вопросам

пятница, 17 мая 2019 г.

Использование Lazy Loading

Пробую использовать lazy loading entityframework. Смотрю примеры с метанита. Но что то не получается. Там есть пример для связи 1 ко многим. Вот мой код: Класс игрок:
class Player { public int Id { get; set; } public string Name { get; set; } public string Position { get; set; } public int Age { get; set; }
public int? TeamId { get; set; } public virtual Team Team { get; set; } }
Класс команда:
class Team { public int Id { get; set; } public string Name { get; set; } public string Coach { get; set; }
public virtual ICollection Players { get; set; } public Team() { Players = new List(); } }
Контекст данных:
class Context : DbContext { public Context() :base("MyConnect") { }
public DbSet Players { get; set; } public DbSet Teams { get; set; } }
И сам код в кнопке формы:
private void button1_Click(object sender, EventArgs e) { using (Context db = new Context()) { var players = db.Players.ToList(); foreach (var p in players) Console.WriteLine($"{p.Name} - {p.Team.Name}");
var teams = db.Teams.ToList(); foreach (var t in teams) { Console.WriteLine($"{t.Name}"); foreach (var p in t.Players) Console.WriteLine($"{p.Name}"); } } }
Так же взятый с метанита. Там утверждается что если свойства с модификаторами public и virtual то lazy loading будет работать без инклюдов и лодов. Но у меня вот этот код выпадает в ошибку как только доходит до строчки с p.Team.Name Так как у игрока не подтягивается коллекция команда. Но если я напишу db.Teams.Load(); тогда всё заработает. Но по моему должно работать и так? Подскажите пожалуйста, в чём проблема? Может я что то не так делаю, уже всю голову сломал.


Ответ

Классы в c# по умолчанию имеют модификатор internal, поэтому если вы пишете:
class Team {}
то ваш класс не public.
Classes and structs that are declared directly within a namespace (in other words, that are not nested within other classes or structs) can be either public or internal. Internal is the default if no access modifier is specified.
А именно это влияет на lazy load:
При использовании ленивой загрузки надо иметь в виду некоторые моменты при объявлении классов. Так, классы, использующие ленивую загрузку должны быть публичными, а их свойства должны иметь модификаторы public и virtual.
Пример на метаинте - с public.

Комментариев нет:

Отправить комментарий