EF6代码首次延迟加载导致空集合

N-ate

这样就创建了动态代理,但是我无法弄清楚为防止导航属性延迟加载而做错了什么。这是我运行以测试该问题的确切代码。

DbContext:

public class MyDbContext : DbContext
{
    public MyDbContext()
        : base("MyConnection")
    {
    }

    public DbSet<One> Ones { get; set; }

    public DbSet<Many> Manies { get; set; }
}

班级:

public class One
{
    public int Id { get; set; }

    public virtual ICollection<Many> Manies { get; set; }

    public One()
    {
        Manies = new List<Many>();
    }
}

public class Many
{
    public int Id { get; set; }

    public string Value { get; set; }

    public int OneId { get; set; }

    public virtual One One { get; set; }

    public Many()
    {
    }
}

测试:

    [TestMethod]
    public void OneToManyTest()
    {
        One parent1 = new One();
        parent1.Manies.Add(new Many() { Value = "child 1" });
        parent1.Manies.Add(new Many() { Value = "child 2" });

        using (MyDbContext db = new MyDbContext())
        {
            db.Ones.Add(parent1);
            db.SaveChanges();
        }
        Assert.IsTrue(parent1.Id > 0, "Id not set");

        One parent2;
        using (MyDbContext db = new MyDbContext())
        {
            db.Configuration.ProxyCreationEnabled = true;
            db.Configuration.LazyLoadingEnabled = true;
            parent2 = db.Ones.Find(parent1.Id);//parent2 is a dynamic proxy
        }

        Assert.AreEqual(parent1.Id, parent2.Id);
        /*parent2.Manies is null*/
        Assert.AreEqual(parent1.Manies.Count, parent2.Manies.Count);//fails
    }

数据库:

在此处输入图片说明

我已验证数据库中已插入正确的信息。关系看起来不错。我确定我缺少明显的东西。

更新

这有效:

using (MyDbContext db = new MyDbContext())
{
    db.Configuration.ProxyCreationEnabled = true;
    db.Configuration.LazyLoadingEnabled = true;
    parent2 = db.Ones.Find(parent1.Id);//parent2 is a dynamic proxy
    Assert.AreEqual(parent1.Id, parent2.Id);
    Assert.AreEqual(parent1.Manies.Count, parent2.Manies.Count);
}

这不是:

using (MyDbContext db = new MyDbContext())
{
    db.Configuration.ProxyCreationEnabled = true;
    db.Configuration.LazyLoadingEnabled = true;
    parent2 = db.Ones.Find(parent1.Id);//parent2 is a dynamic proxy
}
using (MyDbContext db = new MyDbContext())
{
    Assert.AreEqual(parent1.Id, parent2.Id);
    Assert.AreEqual(parent1.Manies.Count, parent2.Manies.Count);//parent2.Manies is null
}

因此,内置延迟加载需要相同的数据库上下文。

乔塔贝

要触发延迟加载,需要在处置上下文之前以某种方式访问​​属性。

您的测试代码在离开上下文之前不会访问属性:

    One parent2;
    using (MyDbContext db = new MyDbContext())
    {
        db.Configuration.ProxyCreationEnabled = true;
        db.Configuration.LazyLoadingEnabled = true;
        parent2 = db.Ones.Find(parent1.Id);//parent2 is a dynamic proxy
    }
    // Context disposed: thsi would throw an exception:
    var manies = parent2.Manies.ToList()

至此,您的上下文已经处理完毕。如果您尝试访问该Manies属性,则会显示一条错误消息。

    One parent2;
    using (MyDbContext db = new MyDbContext())
    {
        db.Configuration.ProxyCreationEnabled = true;
        db.Configuration.LazyLoadingEnabled = true;
        parent2 = db.Ones.Find(parent1.Id);//parent2 is a dynamic proxy
        // Context available: this sill lazy load the Manies entities
        var manies = parent2.Manies.ToList(); 
    }

现在,如果您检查manies属性,它将可用。

延迟加载的想法是,尽管上下文可用,但您第一次访问最初未加载的属性时,该属性将在此时加载。

请参阅本文,以了解使用EF加载实体的不同方式(快速,懒惰,显式):

加载相关实体

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EF6代码首次延迟加载导致空集合

来自分类Dev

实体框架6-延迟加载预期为空集合,但返回null(仅在测试中)

来自分类Dev

EF6代码优先-可能导致循环或多个级联路径

来自分类Dev

EF6 延迟加载:添加时加载整个集合?

来自分类Dev

EF6代码优先模型ForeignKey

来自分类Dev

具有相同类型导航属性集合的EF6代码第一实体-如何告诉EF是什么关系?

来自分类Dev

实体框架6,渴望加载嵌套关系返回空集合

来自分类Dev

EF6代码优先对表进行复数的对象名称无效

来自分类Dev

EF6代码优先:使用Fluent API声明外键

来自分类Dev

EF6代码迁移-数据库不同,但相同

来自分类Dev

首先在EF6代码中创建多对多关系

来自分类Dev

使对动态表LINQ EF6代码优先的访问成为可能

来自分类Dev

EF6代码优先更改数据值

来自分类Dev

EF6代码迁移-数据库不同,但相同

来自分类Dev

如何以EF6代码优先的方式删除实体之间的关系?

来自分类Dev

具有相同实体的2个属性时的EF6代码优先混淆

来自分类Dev

EF6代码优先:更新数据库登录失败

来自分类Dev

EF6代码优先:将参数传递给映射的删除存储过程

来自分类Dev

EF6代码迁移-数据操作以将列'filePath'更新为varbinary

来自分类Dev

如何合并.Max()以查询LINQ to EF中的空集合?

来自分类Dev

EF6代码优先,具有通用存储库以及依赖注入和SoC

来自分类Dev

EF6代码优先-使用不匹配的外键配置一对一关系

来自分类Dev

EF6代码第一个多个一对多映射问题/“多重性”错误

来自分类Dev

更改模型时,EF6代码优先删除表(不是整个数据库)

来自分类Dev

EF6代码首先使用数据注释来填充有关SQL表和列的描述

来自分类Dev

如何在EF6代码优先中对数据库上下文使用通用类型

来自分类Dev

如何为一个模型创建两个导航属性(EF6代码优先)

来自分类Dev

EF6代码首先使用数据注释来填充有关SQL Table和Colums的描述

来自分类Dev

EF6代码优先-使用不匹配的外键配置一对一关系

Related 相关文章

  1. 1

    EF6代码首次延迟加载导致空集合

  2. 2

    实体框架6-延迟加载预期为空集合,但返回null(仅在测试中)

  3. 3

    EF6代码优先-可能导致循环或多个级联路径

  4. 4

    EF6 延迟加载:添加时加载整个集合?

  5. 5

    EF6代码优先模型ForeignKey

  6. 6

    具有相同类型导航属性集合的EF6代码第一实体-如何告诉EF是什么关系?

  7. 7

    实体框架6,渴望加载嵌套关系返回空集合

  8. 8

    EF6代码优先对表进行复数的对象名称无效

  9. 9

    EF6代码优先:使用Fluent API声明外键

  10. 10

    EF6代码迁移-数据库不同,但相同

  11. 11

    首先在EF6代码中创建多对多关系

  12. 12

    使对动态表LINQ EF6代码优先的访问成为可能

  13. 13

    EF6代码优先更改数据值

  14. 14

    EF6代码迁移-数据库不同,但相同

  15. 15

    如何以EF6代码优先的方式删除实体之间的关系?

  16. 16

    具有相同实体的2个属性时的EF6代码优先混淆

  17. 17

    EF6代码优先:更新数据库登录失败

  18. 18

    EF6代码优先:将参数传递给映射的删除存储过程

  19. 19

    EF6代码迁移-数据操作以将列'filePath'更新为varbinary

  20. 20

    如何合并.Max()以查询LINQ to EF中的空集合?

  21. 21

    EF6代码优先,具有通用存储库以及依赖注入和SoC

  22. 22

    EF6代码优先-使用不匹配的外键配置一对一关系

  23. 23

    EF6代码第一个多个一对多映射问题/“多重性”错误

  24. 24

    更改模型时,EF6代码优先删除表(不是整个数据库)

  25. 25

    EF6代码首先使用数据注释来填充有关SQL表和列的描述

  26. 26

    如何在EF6代码优先中对数据库上下文使用通用类型

  27. 27

    如何为一个模型创建两个导航属性(EF6代码优先)

  28. 28

    EF6代码首先使用数据注释来填充有关SQL Table和Colums的描述

  29. 29

    EF6代码优先-使用不匹配的外键配置一对一关系

热门标签

归档