Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 实体框架加载不起作用_C#_Entity Framework_Entity Framework 6_Eager Loading - Fatal编程技术网

C# 实体框架加载不起作用

C# 实体框架加载不起作用,c#,entity-framework,entity-framework-6,eager-loading,C#,Entity Framework,Entity Framework 6,Eager Loading,我想使用EntityFramework6和Eager加载从db加载一个对象列表。但实体框架使用延迟加载。我使用了SQL profiler,在访问引用子实体的属性时执行查询。 通过使用“Include”,您可以一次性加载相关的实体,但事实并非如此。我的代码如下: using (var flightsPricingRulesContext = new FlightsPricingRulesDbContext()) { flightsPricingRulesContext

我想使用EntityFramework6和Eager加载从db加载一个对象列表。但实体框架使用延迟加载。我使用了SQL profiler,在访问引用子实体的属性时执行查询。 通过使用“Include”,您可以一次性加载相关的实体,但事实并非如此。我的代码如下:

    using (var flightsPricingRulesContext = new FlightsPricingRulesDbContext())
    {
       flightsPricingRulesContext.Configuration.ValidateOnSaveEnabled = false;
       flightsPricingRulesContext.Configuration.AutoDetectChangesEnabled = false;


   var filter = PredicateBuilder.True<FlightsPricingRulesDataAccess.Models.ServiceFee>();

    if (!String.IsNullOrEmpty(selectedMarketId))
    {
       var selectedMarket = Int32.Parse(selectedMarketId);
       filter = filter.And(sf => sf.MarketId == selectedMarket);
    }

    if (!String.IsNullOrEmpty(selectedApplicationTypeId))
    {
       var selectedAppplicationType = Int32.Parse(selectedApplicationTypeId);
       filter = filter.And(sf => sf.ApplicationType == selectedAppplicationType);
    }

    var Query = 
    from P in flightsPricingRulesContext.ServiceFee.AsExpandable().Where(filter)select P;

    switch (orderby)
    {
      case null:
      case "":
      case "Id":
      Query = String.IsNullOrEmpty(orderbydirection) || orderbydirection  == "ASC"
      ?Query.OrderBy(p => p.Id): Query.OrderByDescending(p => p.Id);
      break;

      case "market":
      Query = String.IsNullOrEmpty(orderbydirection) || orderbydirection == "ASC"
      ? Query.OrderBy(p => p.MarketId)
      : Query.OrderByDescending(p => p.MarketId);
      break;
    }

    var takeitems = 10 ;
    var skipitems = (Int32.Parse(page) - 1) * 10);

    //BY USING INCLUDE EAGER LOADING IS ENABLED
    Query = Query.Skip(skipitems).Take(takeitems).
    Include(sf => sf.ServiceFeeZone.Select(sfz => sfz.Zone)).
    Include(sf => sf.ServiceFeeCarrier).
    Include(sf => sf.ServiceFeeClassOfService).
    Include(sf => sf.ServiceFeeDate).
    Include(sf => sf.ServiceFeeMarkUpAssignment).
    Include(sf => sf.ServiceFeeAssignment);

    var results = Query.ToList();//HERE A COMPLETE QUERY SHOULD BE 
    //SENT TO THE DB FOR RETRIEVING ENTITES INCLUDING THEIR CHILDREN

    var totalresults = flightsPricingRulesContext.ServiceFee.AsExpandable().Count(filter);

    var pagedservicefees = new PagedServiceFee();
    pagedservicefees.totalitems = totalresults.ToString();
    pagedservicefees.servicefees = new List<FlightsPricingRules.Models.ServiceFee>();


    foreach (var servicefeedto in results)
    {
       var servicefee = new FlightsPricingRules.Models.ServiceFee();

       servicefee.id = servicefeedto.Id.ToString();
       servicefee.marketId = servicefeedto.MarketId.ToString();
        //.....
        //SOME MORE PROPERTIES
        //                      

    //CHILD ENTITIES

        //Zones
        servicefee.zones = new List<Zone>();
        //HERE AN   ADDITIONAL QUERY IS MADE TO LOAD THE CHILD ENTITIES-WHY?
        foreach (var zonedto in servicefeedto.ServiceFeeZone)
        {
           var zone = new Zone();
           zone.id = zonedto.ZoneId.ToString();
           zone.name = zonedto.Zone.Name;
           servicefee.zones.Add(zone);
         }

          //Carriers
          servicefee.carriers = new List<Carr>();
          //ALSO HERE AND ADDITIONAL QUERY IS MADE
          foreach (var carrierdto in servicefeedto.ServiceFeeCarrier)
          {
            var carrier = new Carr();
            carrier.id = carrierdto.AirlineId.ToString();
            servicefee.carriers.Add(carrier);
           }


      pagedservicefees.servicefees.Add(servicefee);
   }
   //.......
   //SOME MORE CHILD ENTITIES
   //


return Json(pagedservicefees, JsonRequestBehavior.DenyGet);

}                
使用(var flightspricingrulesscontext=new flightspricingrulessdbcontext())
{
FlightSpricingRuleContext.Configuration.ValidateOnSaveEnabled=false;
FlightSpricingRuleContext.Configuration.AutoDetectChangesEnabled=false;
var filter=PredicateBuilder.True();
如果(!String.IsNullOrEmpty(selectedMarketId))
{
var selectedMarket=Int32.Parse(selectedMarketId);
filter=filter.And(sf=>sf.MarketId==selectedMarket);
}
如果(!String.IsNullOrEmpty(selectedApplicationTypeId))
{
var selectedapplicationtype=Int32.Parse(selectedApplicationTypeId);
filter=filter.And(sf=>sf.ApplicationType==selectedapplicationtype);
}
变量查询=
从FlightSpricingRuleContext.ServiceFee.AsExpandable()中的P。其中(筛选器)选择P;
交换机(订购方)
{
大小写为空:
案例“”:
案例“Id”:
Query=String.IsNullOrEmpty(orderbydirection)| | orderbydirection==“ASC”
?Query.OrderBy(p=>p.Id):Query.OrderByDescending(p=>p.Id);
打破
案例“市场”:
Query=String.IsNullOrEmpty(orderbydirection)| | orderbydirection==“ASC”
?Query.OrderBy(p=>p.MarketId)
:Query.OrderByDescending(p=>p.MarketId);
打破
}
风险价值项目=10;
var skipitems=(Int32.Parse(page)-1)*10);
//通过使用INCLUDE,可以启用即时加载
Query=Query.Skip(skipitems).Take(takeitems)。
包括(sf=>sf.ServiceFeeZone.Select(sfz=>sfz.Zone))。
包括(sf=>sf.ServiceFeeCharrier)。
包括(sf=>sf.ServiceFeeClassOfService)。
包括(sf=>sf.ServiceFeeDate)。
包括(sf=>sf.ServiceFeeMarkUpAssignment)。
包括(sf=>sf.ServiceFeeAssignment);
var results=Query.ToList();//这里应该是一个完整的查询
//发送到DB以检索实体(包括其子实体)
var totalresults=flightspricingrulecontext.ServiceFee.AsExpandable().Count(过滤器);
var pagedservicefees=新的PagedServiceFee();
pagedservicefees.totalitems=totalresults.ToString();
pagedservicefees.servicefees=新列表();
foreach(结果中的var servicefeedto)
{
var servicefee=new FlightsPricingRules.Models.servicefee();
servicefee.id=servicefeedto.id.ToString();
servicefee.marketId=servicefeedto.marketId.ToString();
//.....
//更多属性
//                      
//子实体
//地带
servicefee.zones=新列表();
//这里还进行了一个额外的查询来加载子实体——为什么?
foreach(servicefeedto.ServiceFeeZone中的var zonedto)
{
var zone=新区域();
zone.id=zonedto.ZoneId.ToString();
zone.name=zonedto.zone.name;
servicefee.zones.Add(区域);
}
//承运人
servicefee.carriers=新列表();
//此外,这里还提供了其他查询
foreach(servicefeedto.ServiceFeeCarrier中的var carrierdto)
{
var carrier=新的Carr();
carrier.id=carrierTo.AirlineId.ToString();
服务费。承运商。添加(承运商);
}
pagedservicefees.servicefees.Add(servicefee);
}
//.......
//还有一些子实体
//
返回Json(pagedservicefees,JsonRequestBehavior.DenyGet);
}                

好的,我想出来了。事实证明,将Include语句放在哪里确实很重要。我将Include语句放在.AsExpandable()之前,然后放在父实体之后,现在执行了即时加载。我还可以使用SQL profiler验证,查询包含所有必要的连接,并且执行速度非常快。正确的查询现在是:

var Query = from P in flightsPricingRulesContext.ServiceFee
.Include(sf =>   sf.ServiceFeeCarrier)
.Include(sf=>sf.ServiceFeeAssignment)
.Include(sf => sf.ServiceFeeClassOfService)
.Include(sf => sf.ServiceFeeDate)
.Include(sf => sf.ServiceFeeMarkUpAssignment)
.Include(sf => sf.ServiceFeeZone.Select(zo => zo.Zone))
.AsExpandable().Where(filter) select P;

如果有人遇到相同的情况,请发布答案。

那么到底发生了什么?通过使用“包含”,您可以一次性加载相关实体,但它没有发生,这对我们来说不是非常清楚和描述性。@BviLLe_Kid似乎忽略了包含。子实体在作为属性访问时通过附加查询从数据库中获取。我已经在我的代码中使用了注释来显示正在发生的事情。同样,似乎忽略了包含,请确保这确实发生了。我并不想成为一个固执的人,但一旦排除了某些可能性,诊断就会更容易。你调试过了吗?@BviLLe_Kid是的,我已经调试过了,我使用SQL分析器查看EF生成的SQL。Query.ToList()语句没有将完整查询发送到数据库。它错过了连接。嗯,只是为了测试。。试着在
跳过
采取
之前执行
包含