Entity Framework 不创建新代理 为什么?

Entity Framework Doesn't create a new proxy Why?

我在使用 EF (6.0.0) 时遇到了一些问题

这是代码

var Answer = new TicketAnswer();
Answer.Answer = "hello";
Answer.TicketId = 20;
Answer.ConfirmDate = DateTime.Now;
db.TicketAnswer.Add(Answer);
db.SaveChanges();

AnswerId = Answer.ID;

db.TicketAnswer.Where(x=> x.ID == AnswerId).FirstOrDefault();

在那之后,当我尝试使用与答案相同的 ID(这是新创建的)获取 db.TicketAnswer 时,EF 返回 TicketAnswer class(不是代理),我无法访问到 Ticket class 上面(Ticket 属性 为 null 即使 TicketId 不为 null 并且数据库上有 Ticket Id = 20,关系没有问题),但是当我将查询更改为:

var a = db.TicketAnswer.Where(x => x.ID == 225).FirstOrDefault();

EF 返回 System.Data.Entity.DynamicProxies_ASDGAFD... 我可以访问 Ticket class。

我想要的只是,通过 TicketAnswer class 到达 Ticket class,我该怎么办?

您的导航 属性 尚未为该上下文中新添加的实体加载。要加载它,您必须:

 var ticketAnswer = db.TicketAnswer.Include(ta => ta.Ticket).Where(x=> x.ID == AnswerId).FirstOrDefault();

或更好:

 var ticketAnswer = db.TicketAnswer.Include(ta => ta.Ticket).Single(ta=> ta.Id == answerId);

有人可能会问"Then why the other entity (with Id == 225) is loaded without using this .Inlcude thing?"

答案是:该实体肯定是由其他 运行 会话使用其他数据库上下文实例添加的。因此该实体不在当前数据库上下文实例的缓存中。当请求它时,EF 将加载它,导航属性在没有显式包含的情况下可用。然而,新添加的实体是 缓存中,没有导航属性。简单地使用 where 请求它会返回您添加的相同实例。注意:不只是完全相同的实体:完全相同的 instance.

要在您的实体图中导航多个跃点,您可以使用:

.Include("Ticket.User") // In case if the Ticket entity has a navigation property called 'User'