【问题标题】:EF resolve navigation property after manual attachEF 在手动附加后解析导航属性
【发布时间】:2016-03-01 13:25:21
【问题描述】:

我正在使用实体框架。我已使用以下方法将代表数据库中实体的 POCO 对象附加到我的 dbcontext:

var entity = new MyEntity() { ID = 1, AnotherItemID = 10 };
context.Set<T>().Attach(entity);

到目前为止一切顺利。我可以访问该集合并使用我添加的实体。它以未更改状态添加。但是,它只是 POCO 而不是代理。因此,当我尝试访问导航属性时,例如myEntity.AnotherItem,我只是得到一个空返回。

有谁知道是否有办法让 EF 解析以这种方式附加的 POCO 类的导航属性?或者将 POCO 转换为代理类的方法?

谢谢

更新 有两种方法可以解决这个问题(当然也可能有其他方法!)。一个是下面答案中的显式加载选项。另一种允许延迟加载工作的方法是在创建要附加的实体时使用 DBSet Create 方法而不是 POCO new 关键字。更多信息请点击此处:

EF4.3 Code-First, MVC, Lazy Loading After Attaching in POST Action

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    你可以使用Explicity Loading:

     //When you want to load a reference navigation property
     context.Entry(entity).Reference(p => p.AnotherItem).Load(); 
    
     //When you want to load a collection navigation property
     context.Entry(post).Collection(p => p.Items).Load(); 
    

    【讨论】:

    • 嗨@octavioccl 感谢您的快速回复。我试图通过延迟加载来实现解决方案,因此我不必提前考虑要显式加载的内容。但也许我在这个场合有点太懒了!
    • 问题,您的导航属性是virtual,因为这是延迟加载的要求。附加后,您应该能够延迟加载相关实体。
    • 是的,它们是虚拟的。如果我实际上从数据库中检索实体,它们会延迟加载。那么即使在手动创建和附加实体时,它们是否应该自动延迟加载?也许我没有正确附加它?
    • 这就是我的猜测,但也许我错了,事实上我这些天没有使用延迟加载,但也许你可以使用Create 方法开始创建你的实例实体而不是使用new。另一种方法是使用 Find 方法,使用实体的 ID。
    • 我也正要发布关于 Create 的帖子!我发现它在另一个问题中提到,我将作为更新添加。这确实是关键:在将实体创建为代理类时使用 Create 而不是 new 结果,瞧,延迟加载就可以工作了。
    猜你喜欢
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多