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'
我在使用 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'