我有一个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; }
}
}
答案 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)
除了“不道德”方面的好答案之外,我还将在这里放置以下链接: