#c_sharp #winforms #entity_framework
Пробую использовать 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(); тогда всё заработает. Но по моему должно работать
и так? Подскажите пожалуйста, в чём проблема? Может я что то не так делаю, уже всю
голову сломал.
Ответы
Ответ 1
Классы в 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.
Комментариев нет:
Отправить комментарий