Свойство объекта является нулевым после получения данных из БД. Entity Framework - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть DBContext, который инициализируется через DropCreateDatabaseAlways класс. В методе Seed у меня есть этот код:

            base.Seed(context);
            var c1 = new Company { Name = "Samsung"};
            var c2 = new Company { Name = "Microsoft"};
            context.Companies.AddRange(new List<Company>{c1,c2 });
            var phones = new List<Phone>
            {
                new Phone("Samsung Galaxy S5", 20000, c1),
                new Phone("Nokia S1243", 200000, c1),
                new Phone("Nokia 930", 10000, c2),
                new Phone("Nokia 890", 8900, c2)

            };
            context.Phones.AddRange(phones);

            context.SaveChanges();

И если перебрать phones сейчас, я вижу, что phone.Company не null. Но когда я делаю это в любом другом фрагменте кода, phone.Company IS null. Что я делаю не так? Простой кусок кода с нулевым phone.Company:

using (var db = new MyDataModel())
        {
            var phonesList = db.Phones.ToList();
            foreach (var p in phones)
            {
                System.Console.WriteLine($"Name: {p.Name} 
                Company: {p.Company}"); // Company is null.
            }
        }

Я могу получить доступ к Company, используя Join с компаниями на phone.companyId, поэтому в БД существует таблица Companies.

Мой DataModel класс:

public class MyDataModel : DbContext
{
    public MyDataModel()
        : base("name=MyDataModel")
    {
    }

    static MyDataModel()
    {
        Database.SetInitializer(new MyContextInializer());
    }

    public DbSet<Company> Companies { get; set; }
    public DbSet<Phone> Phones { get; set; }
}

Мой Phone класс:

namespace DataContext
{


public class Phone
    {
        public Phone()
        {

        }
        public Phone(string name, int price, Company company)
        {
            Name = name;
            Price = price;
            Company = company;
        }

        public int Id { get; set; }

        public string Name { get; set; }

        public int Price { get; set; }

        public int CompanyId { get; set; }

        public Company Company { get; set; }

    }
}

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

В дополнение к классному ответу от Безнравственности, я размещу здесь эти ссылки:

  1. Виртуальные свойства

  2. MSDN - Загрузка связанных стратегий данных

0 голосов
/ 05 сентября 2018

Если вы хотите автоматически загружать компании при загрузке телефона, вам нужно добавить ключевое слово virtual перед свойством Company.

public class Phone { 

    public Phone() {

    }
    public Phone(string name, int price, Company company)
    {
        Name = name;
        Price = price;
        Company = company;
    }

    public int Id { get; set; }

    public string Name { get; set; }

    public int Price { get; set; }

    public int CompanyId { get; set; }

    public virtual Company Company { get; set; }

}

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

В качестве альтернативы вы можете использовать энергичную загрузку при выполнении запроса на телефонах.

var phones = MyDataModel.Phones.Include(x => x.Company).ToList();
...