我在控制台应用程序中有两个类。当实体不公开时,实体框架不会加载相关数据
Person
:
class Person {
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<Order> Orders { get; set; }
public override string ToString() {
return Id + " " + FirstName + " " + LastName;
}
}
和Order
:
class Order {
//Id to domyslna nazwa na identyfikator -> klucz glowny
public int Id { get; set; }
public int Total { get; set; }
public virtual Person Owner { get; set; }
public override string ToString() {
return Id + " " + Total;
}
}
我dbContext
是:
class ApplicationDbContext : DbContext {
public DbSet<Person> Persons { get; set; }
public DbSet<Order> Orders { get; set; }
public ApplicationDbContext()
: base("Olek2") {
Configuration.LazyLoadingEnabled = true;
Configuration.ProxyCreationEnabled = true;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
public static ApplicationDbContext Create() {
return new ApplicationDbContext();
}
}
我通过update-database
产生新的数据库。
在Main
方法我试图获取Person
,然后访问人员的订单,但我得到p1.Orders.Count()
空指针异常。我做了属性虚拟,也启用延迟加载,我不知道问题在哪里。
static void Main(string[] args) {
ApplicationDbContext context = new ApplicationDbContext();
Person p1 = context.Persons.Find(1);
Console.WriteLine(p1); // THIS WORKS
Console.WriteLine(context.Orders.Count()); //THIS IS 1
Console.WriteLine(p1.Orders.Count()); //EXCEPTION HERE
Console.ReadKey();
}
而且我Seed
方法:
protected override void Seed(ApplicationDbContext context) {
Person person = null;
if (!context.Persons.Any()) {
person = new Person() { FirstName = "Alaaaaa", LastName = "Kowlaska" };
context.Persons.AddOrUpdate(person);
}
if (!context.Orders.Any()) {
context.Orders.AddOrUpdate(new Order() { Total = 100, Owner = person });
}
context.SaveChanges();
}
编辑:
我有一种预感,它是与public static ApplicationDbContext Create()
已经0引用(VS2013表示)在我的控制台应用程序(失败)。
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context and user manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
....
}
EDIT2 我有预感它似乎并没有被无论如何连接:
在我的ASP.NET MVC(正常工作)它被引用。
您是否尝试过为订单添加'include'子句? –
@PeterSmith我从来不用它们。在其他更大的项目(ASP.NET-MVC 5)中,我制作了超过10个模型类和数十个关联,启用了lazyloading并使用了虚拟关键字,而我从未遇到过这个问题。我应该在发布的代码中更改哪些内容?我不明白异常的原因,因为EF在我请求时会自动加载'order' - >这个代表延迟加载的想法。 – Yoda
你是否检查过数据库中的内容?如果一个人已经存在,你的种子方法将添加一个具有空所有者的订单。这就是说,人。在这种情况下,订单应该是空的而不是空的。 –