实体框架没有创建新的代理为什么?

本文关键字:代理 为什么 创建 框架 实体 | 更新日期: 2023-09-27 18:06:05

我在使用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();

之后,当我试图得到db。与答案(这是新创建的)相同Id的TicketAnswer EF返回TicketAnswer类(不是代理),我不能访问票券类(票券属性为空,即使TicketId不为空,并且在Id = 20的数据库上有票券,关系没有问题),但当我更改我的查询为:

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

EF返回System.Data.Entity.DynamicProxies_ASDGAFD…我可以访问Ticket类

我想要的是,到达Ticket类超过TicketAnswer类,我该怎么办?

实体框架没有创建新的代理为什么?

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

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

有人可能会问:"那么为什么另一个实体(Id == 225)在没有使用. include的情况下加载呢?"

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

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

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