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

297
05 апреля 2018, 11:55

Пробую использовать 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<Player> Players { get; set; }
        public Team()
        {
            Players = new List<Player>();
        }
    }

Контекст данных:

class Context : DbContext
    {
        public Context()
            :base("MyConnect")
        { }
        public DbSet<Player> Players { get; set; }
        public DbSet<Team> 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(); тогда всё заработает. Но по моему должно работать и так? Подскажите пожалуйста, в чём проблема? Может я что то не так делаю, уже всю голову сломал.

Answer 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.

READ ALSO
Сообщает ли MongoDB о расположении Master

Сообщает ли MongoDB о расположении Master

На сколько мне известно, запись ведется только через Master, а чтение возможно и из SlaveОднако встаёт такой вопрос: Если я подключился к Slave и знаю...

255
Медленная отрисовка DataGridView

Медленная отрисовка DataGridView

По событию загрузки формы выполняю следующий код

276
Сериализация: паттерн composite

Сериализация: паттерн composite

Как нужно записывать в xml-файл объекты класса? Я сделал это так, но при добавлении листа (Leaf) появляется исключение:

281