在一个非常简单的房地产程序中,我尝试使用 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(使用前将#替换为@)