从数据库获取数据后,对象属性为null。实体框架

时间:2018-09-05 13:12:44

标签: database entity-framework linq null

我有一个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就是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 :(得分:1)

如果要在加载电话时自动加载公司,则需要在Company属性之前添加virtual关键字。

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();

答案 1 :(得分:0)

除了“不道德”方面的好答案之外,我还将在这里放置以下链接:

  1. Virtual properties

  2. MSDN - Loading related data strategies