加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Entity Framework没有懒惰地加载引用和集合属性

发布时间:2020-12-15 23:38:51 所属栏目:百科 来源:网络整理
导读:我有背包和书籍实体.书籍参考背包(一对多). 我正在创建一个背包和一堆书籍的实例.所以在这种情况下,背包有很多书.我将这些实体保存到数据库中.我正在验证那些已保存到数据库中.当我尝试加载背包时,它加载正常,除导航属性外,所有属性都已设置.我也在检查是否
我有背包和书籍实体.书籍参考背包(一对多).
我正在创建一个背包和一堆书籍的实例.所以在这种情况下,背包有很多书.我将这些实体保存到数据库中.我正在验证那些已保存到数据库中.当我尝试加载背包时,它加载正常,除导航属性外,所有属性都已设置.我也在检查是否禁用了LazyLoading.我的导航属性具有virtual关键字.
我不确定我做错了什么.如果我尝试使用Include()加载背包,则会加载书籍:

dbContext.Backpacks.Where(b=>b.Name!="").Include("Books").FirstOrDefault()

我想弄清楚为什么它懒得装书?加载这本书时遇到同样的问题.当我装书时,它没有附加背包.我看到BackpackId就在那里.

在我的属性getter / setter中,我有一些会被触发的逻辑,但我不确定这可能是一个什么问题.

解决方法

由于手头的信息有限,我可以看到您的问题的以下解释.

延迟加载或代理创建被禁用

确保启用了延迟加载和代理创建,如果没有后者,则第一个不起作用.

dbContext.Configuration.ProxyCreationEnabled = true;
dbContext.Configuration.LazyLoadingEnabled = true;

(详见this SO post)

在处理上下文后访问实体

简化,Lazy Loading的工作方式如下:

>每当从上下文中检索实体时,实际上都会获得一个自动创建的类的子对象,该类可以覆盖您的虚拟导航属性,即代理.
>每当您访问所述导航属性时,代理将访问数据库并在需要时加载链接的实体.

当然,最后一步只有在实体/代理仍然附加到上下文并且因此可以查询数据库以检索所述对象时才可能.

using( var dbContext = new MyContext() )
{
    dbContext.Configuration.ProxyCreationEnabled = true;
    dbContext.Configuration.LazyLoadingEnabled = true;
    // Note: You can modify or derive from `MyContext` so that this is
    //       done automatically whenever a new `MyContext` is instantiated

    var backpack = dbContext.Backpacks.Where(b=>b.Name!="").FirstOrDefault();

    // This should work
    var firstBook = backpack.Books.FirstOrDefault();
}

// This will probably not,because the context was already disposed
var firstDrink = backpack.Drinks.FirstOrDefault();

我希望这会有所帮助,但如果没有,请随时提供更多信息

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读