MySQL + Code First + 延迟加载问题!

2024-04-19

在一个非常简单的房地产程序中,我尝试使用 EF Code First 列出房屋的所有图像,附加到我拥有的现有数据库,我使用 MySQL Conector 6.3.6,这是我的代码。

namespace CodeFirstMySQL
{
    class Program
    {
        static void Main(string[] args)
        {
            RealEstate db = new RealEstate();

            var houses = (from h in db.Houses
                         select h).Take(10);

            foreach (var house in houses)
            {
                Console.WriteLine(string.Format("Images for {0}", house.Address));
                foreach (Image image in house.Images)
                {
                    Console.WriteLine(string.Format("=> {0}", image.FileName));
                }
            }
        }
    }

    public class RealEstate : DbContext
    {
        public DbSet<House> Houses { get; set; }
        public DbSet<Image> Images { get; set; }
    }

    [Table("CADIMO")]
    public class House
    {
        [Column("CODIGO")]
        public int HouseId { get; set; }

        [Column("ENDERECO")]
        public string Address { get; set; }

        public virtual ICollection<Image> Images { get; set; }
    }

    [Table("CDIMIM")]
    public class Image
    {
        [Key]
        [Column("CODIGO", Order = 0)]
        public int HouseId { get; set; }

        [Key]
        [Column("CODIGO_I", Order = 1)]
        public int ImageOrder { get; set; }

        [Column("FILE_PATH")]
        public string FileName { get; set; }
    }
}

当我尝试运行此程序时,出现以下错误:

沙丘港的图片
未处理的异常: System.Data.EntityCommandExecutionException: 执行时发生错误 命令定义。 看到内在 详细信息例外。
---> MySql.Data.MySqlClient.MySqlException:已经有一个打开的 DataReader 与此连接相关联的 必须先关闭。
在 MySql.Data.MySqlClient.MySqlCommand.CheckState()
在 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior 行为)
在 MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior 行为)在 System.Data.Common.DbCommand.ExecuteReader(CommandBehavior 行为)在 System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand 实体命令、命令行为 行为)
--- 内部结束 异常堆栈跟踪 ---

有趣的是,如果我使用以下查询

List<House> houses = (from h in db.Houses select h).Take(10).ToList();

然后它可以工作,但会执行急切加载,因为当我检查每栋房子的 Images 属性时,它们已经填充了。所以,我的问题是,延迟加载可以与 MySQL 和 Code First 一起使用吗?

我知道 Linq 在我们使用它之前不会执行查询,所以当需要延迟加载图像时,DataReader 可能仍然打开,这就是问题发生的原因。

对这个问题的任何了解都值得赞赏。

谢谢 安德森·福塔莱萨


...所以当需要延迟加载图像时,DataReader 可能仍然打开,这就是问题发生的原因。

这正是正在发生的事情,但我认为原因并不完全是你想的那样。 DataReader 仍然打开,不是因为 Linq 中的延迟执行,而是因为当您尝试访问尚未加载的其他属性时,您仍在迭代查询结果。你打电话时.ToList()结果立即返回并存储在List<TEntity>在客户端的内存中,而不是一次返回 1 条记录。

您可以使用以下设置在 MS SQL Server 中解决此问题MultipleActiveResultSets=true在您的连接字符串中,但 MySQL 不支持此设置。不过,您应该能够做的是使用以下命令立即加载您需要的附加数据.Include("tablename")

var houses = (from h in db.Houses.Include("Images")
              select h).Take(10);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL + Code First + 延迟加载问题! 的相关文章

  • 更改表以给出外键约束

    我有一个表 其中有 2 列 是从两个不同的表复制的 我现在要做的是对列名 email 和 id 给出外键约束 如下所示 ALTER TABLE users role map ADD CONSTRAINT FK users role map
  • 为什么我收到错误 #1136 - 列计数与第 1 行的值计数不匹配?

    我收到此错误 1136 Column count doesn t match value count at row 1 当我尝试这样做时 INSERT INTO folding cartons part no description cou
  • 如何在我的网站中创建全局搜索[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在我的网站中创建全局搜索 该网站是内部网站 无法在网上使用 我无法使用 Google 搜索来实现此目的 我的信息全部存储在不同的
  • 未找到列:1054 未知列 laravel

    所以我尝试用 laravel 制作一个表单 但除了新版本之外 他们删除了表单 但我可以让它运行 所以这里是 Route post register function user new User user gt u n Input get u
  • Android-数据在微调器中分配,但选择时不显示微调器中的值

    Problem我正在使用 Retrofit 从 mysql 获取一些产品类别 数据即将到来并在微调器中分配 但是当我选择一个项目时 它不会显示 在下拉菜单中 项目已分配 并且 setOnItemSelected 侦听器也正在工作 但所选项目
  • MySqlBulkLoader 说明

    你能告诉我什么吗MySqlBulkLoader的用途 在哪里以及如何使用它 一些例子也将不胜感激 请 MySQLBulkLoader是MySQL Connector Net类中的一个类 包装了MySQL语句LOAD DATA INFILE
  • JPA 与 Hibernate.initialize 等效的命令

    我有一个惰性集合 我想在我的服务 控制器中随意初始化它 此时我能做的就是 Hibernate initialize myEntity getListOfThings 该命令依赖于 hibernate 并且不会使 JPA 的实现变得透明 JP
  • 对于特定用户 MySQL,查找同一表内的日期范围重叠

    我绝不是 MySQL 专家 所以我正在寻求有关此事的任何帮助 我需要执行一个简单的测试 原则上 我有这个 简化的 表 tableid userid car From To 1 1 Fiesta 2015 01 01 2015 01 31 2
  • Laravel - 带有 join 和 concat 的查询生成器

    我试图从用户表中提取与 users groups 数据透视表中某个组匹配的所有用户 顺便说一句 我使用的是来自 Cartalyst 的 Sentry 2 这可以让所有用户的名字和姓氏连接起来 User select DB raw CONCA
  • 如何调试没有错误消息的错误?

    如何调试没有错误消息的错误 当加载 PHP 页面时 我在 Firefox 中收到此错误 The connection to the server was reset while the page was loading 除了看起来是 Apa
  • 匹配 MySQL 中单词/后缀的相似/变体

    我如何匹配 MySQL 中单词的变体 例如搜索 accountancy 应匹配 accountant accountants accounting 等 我使用共享主机 因此无法向 MySQL 添加任何功能 例如 levenshtein 我想
  • 如何选择非“唯一”行

    我有下表 我必须从中获取非唯一行 id idA infos 0 201 1899 1 205 1955 2 207 1955 3 201 1959 我想获取该列的所有行infos 具有相同的idA至少有两行的值 上表的查询输出必须是 inf
  • 每次使用 COUNT() 函数,还是存储该值并将其加一?

    我有一个带有用户 投票 表和 用户 表的数据库 我认为数据库会在短时间内变得相当大 所以我想使用最有效的方法 我想我可以每次使用 投票 表中的 WHERE 语句来 COUNT 投票数 或者我可以将分数存储在 用户 表中 每次投票时将其增加
  • 如何使用 ASP.net EF Codefirst 数据注释将 SQL Server 中的列设置为 varchar(max)?

    我一直在网上搜索 试图找出正确的语法 让 Entity Framework Code First 使用一列创建表 varchar max 这就是我所拥有的 默认情况下 这会创建 varchar 128 如何创建 varchar max 我尝
  • CSV 损坏,如何修复?

    我正在尝试解析 CSV 我想将它放入数据库或只是用 JavaScript 解析它 但由于语法损坏 任何一种方法都会失败 我的整个 CSV 文件在这里 https gist github com 1023560 https gist gith
  • AngularJS、ocLazyLoad 和加载动态状态

    app define angular angular ui router ocLazyLoad config common layout services menuService function angular use strict va
  • MySQL使用BLOB的二进制存储VS OS文件系统:大文件、大数量、大问题

    我正在运行的版本 基本上 最新的一切 PHP 5 3 1MySQL 5 1 41阿帕奇 2 2 14操作系统 CentOS 最新 情况是这样的 我有数千个非常重要的文档 从客户合同到语音签名 客户对合同的授权录音 文件类型包括但不限于jpg
  • 在没有条件的情况下,如何使查询不返回任何内容?

    相当简单 我有一对多 多对一关系 我想查询它 但是 当未提供任何 WHERE 子句信息时 我不希望返回任何结果 简单来说 如何使查询变得非贪婪 您可以添加一个始终为 false 的 where 子句 并附加您想要用 OR 提供的条件 sel
  • SQL Server 与 MySQL:CONTAINS(*,'FORMSOF(THESAURUS,word)')

    我很震惊 当我在 SQL Server 中看到查询非常简单时 我花了 3 4 天弄清楚如何在 mysql 中实现词干提取 和同义词搜索 Select from tab where CONTAINS FORMSOF THESAURUS wor
  • mysql REGEXP 不匹配

    我有一个正则表达式 旨在捕获字符串中的电话号码 1 s d 3 s d 3 s d 4 我尝试使用以下查询在 MySql 数据库中查询此正则表达式 SELECT FROM everything instances meta AS m WHE

随机推荐