Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 延迟加载实体框架6中的数据,MySql不工作_C#_Mysql_Entity Framework_Entity Framework 6_Code First - Fatal编程技术网

C# 延迟加载实体框架6中的数据,MySql不工作

C# 延迟加载实体框架6中的数据,MySql不工作,c#,mysql,entity-framework,entity-framework-6,code-first,C#,Mysql,Entity Framework,Entity Framework 6,Code First,我正在使用MySql进行一个代码优先的EF6项目。我已经设置了我的数据类,这样它们的相关数据对象应该是延迟加载的,但是每次调用它们时,它们似乎运行得非常慢 这是我的一个实体类的示例: [Table("Carrier")] public class DBCarrier { [Key] [Column("CarrierId")] public int carrierId { get; set; } [MaxLength(128), Required] pub

我正在使用MySql进行一个代码优先的EF6项目。我已经设置了我的数据类,这样它们的相关数据对象应该是延迟加载的,但是每次调用它们时,它们似乎运行得非常慢

这是我的一个实体类的示例:

[Table("Carrier")]
public class DBCarrier
{
    [Key]
    [Column("CarrierId")]
    public int carrierId { get; set; }

    [MaxLength(128), Required]
    public string CarrierName { get; set; }

    public virtual ICollection<DBDepot> Depots { get; set; }
    public virtual ICollection<DBZone> Zones { get; set; }
}

每次我打电话给carrier.Zones大约需要8秒钟。我认为将
区域定义为ICollection会延迟数据库查询的执行。

ICollection
意味着数据肯定已经在内存中具体化了。获得所需行为的唯一方法是使用支持延迟执行的接口,只有两种:

  • 查询是使用
    表达式构建的,用于对远程数据源(例如sql数据库)发起查询
  • 查询是使用
    委托创建的,用于对内存中已有的数据集进行查询
当您使用
First()
FirstOrDefault()
ToList()
ToArray()
迭代数据时,使用这两种接口类型中的任何一种都会导致执行查询

但是,看到您只需要区域的名称,您的查询效率很低。获取整个
DBZone
对象,但只获取名称,我建议只获取名称:

return carrier.Zones.FirstOrDefault(z => z.Postcode == postcode).Select(z => z.ZoneName);
为此,您当然需要将
carrier
保留为
IQueryable

编辑:刚刚注意到“每次我给carrier.Zones打电话,运行大约需要8秒。”


这是延迟加载的预期行为。当您访问数据库时,将从数据库中获取数据=>运营商的数据库调用,当您访问区域时,将为区域调用另一个数据库调用。这可以通过使用即时加载(
Include
method)来避免,以便在数据库的一次访问中获得所有所需的数据。

是有意义的。我以后再试试。
return carrier.Zones.FirstOrDefault(z => z.Postcode == postcode).Select(z => z.ZoneName);