【发布时间】:2011-05-10 14:10:49
【问题描述】:
在一个非常简单的房地产程序中,我尝试使用附加到现有数据库的 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; }
}
}
当我尝试运行它时,我收到以下错误:
Porto das Dunas 的图片
未处理的异常: 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 可能仍然打开,这就是问题发生的原因。
感谢您对此问题的任何了解。
谢谢你 安德森福塔莱萨
【问题讨论】:
标签: mysql lazy-loading ef-code-first