【发布时间】:2014-09-15 14:57:26
【问题描述】:
使用 Entity Framework 6.1.x 和启动基本 Asp.NET MVC 项目时包含的默认用户 (ApplicationUser) 模型。与该问题相关的是另外两个实体:客户和组织(都在进行中)。下面是 Customer 类。
public class Customer
{
public Customer()
{
}
public int Id { get; set; }
public string UniqueId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public Organization Organization { get; set; }
}
无论出于何种目的,组织都可以被视为具有单个 Id 属性的最小实体。
以下代码不会在客户集合中包含组织:
var customers = this.context.Customers.Include(c => c.Organization)
.Join(this.context.Users.Where(u => u.Id == userId), c => c.Organization.Id, u => u.Organization.Id, (c, u) => c)
.ToList();
但是,当我将 virtual 添加到 Customer.Organization 属性时,或者如果我通过运行 this.context.Organizations.ToList() 让上下文了解有关组织的信息,它将起作用。
最后,基于this post 谈到.Include() 在.Include() 发出后如果查询改变形状将无法工作,我编写了以下代码:
var customers = this.context.Customers
.Join(this.context.Users.Where(u => u.Id == userId), c => c.Organization.Id, u => u.Organization.Id, (c, u) => c)
.AsQueryable<Customer>().Include(c => c.Organization)
.ToList();
最后一个代码 sn-p 有效,所以我想我可以使用它。
不过,它不如第一个代码漂亮,但更重要的是,我真的很想了解为什么第一个代码不起作用。是因为“查询的形状”正在改变吗?如果是这样,当我在调用查询之前让上下文了解组织时,它是如何工作的?
【问题讨论】:
标签: c# asp.net-mvc entity-framework include