实体框架不创建新代理为什么?

时间:2015-08-03 06:40:30

标签: c# database entity-framework entity relation

我在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.TicketAnswer与答案的相同ID(新创建)时,EF返回TicketAnswer类(不是代理)并且我无法访问Ticket类(Ticket Property)即使是TicketId也不为null,并且db上有Ticket,Id = 20,关系没有问题),但当我将查询更改为:

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

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

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

1 个答案:

答案 0 :(得分:0)

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

 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)加载了而没有使用这个.Inlcude的东西?”

答案是:使用其他数据库上下文实例确实通过其他运行会话添加了该实体。这样实体就不在当前db上下文实例的缓存中。在要求它时,EF将加载它,并且导航属性可用而无需显式包含。但是,新添加的实体是缓存中,没有导航属性。使用where来简单地询问它会让你回到你添加的同一个实例。注意:不仅是完全相同的实体:完全相同的实例

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

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