繁体   English   中英

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

[英]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类(不是代理),并且我无法通过该类访问Ticket类(Ticket属性为null TicketId不为null,并且数据库上的票证的ID = 20,关系没有问题),但是当我将查询更改为:

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

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

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

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

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

一个人可能会问:“那么为什么使用此.Inlcude东西加载另一个实体(Id == 225)?”

答案是:该实体肯定是使用其他数据库上下文实例由其他运行会话添加的。 这样该实体不在当前数据库上下文实例的缓存中。 要求时,EF会加载它,并且导航属性可用而无需显式包含。 但是,新添加的实体位于缓存中,没有导航属性。 只需使用where进行询问,即可返回您添加的实例。 注意:不仅是相同的实体:还是相同的实例

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM