【问题标题】:Entity Framework 4.0 - Including entities - Eager loading problemEntity Framework 4.0 - 包括实体 - 急切加载问题
【发布时间】:2010-06-25 14:23:09
【问题描述】:

我们的数据库中有 3 个表,每个表在我们的 edmx 中都有一个实体。为了说明我的问题,假设有 3 个表:

Table: Make
Fields:
makeID
make

Table: Model
FIelds:
modelID
makeID    foreign key
model

Table: Car
carID
modelID   foreign key
car

我们的 Make、Model 和 Car 实体具有实体模型中的所有导航属性。延迟加载被禁用。我们希望能够将所有吉普大切诺基汽车输出到我们的页面。

现在我们的一个函数中有这样的东西(C# 4.0)

IEnumerable<Make> makeList =  (((ObjectSet<Lot>)_modelRepository.GetQuery())
         .Include(mk => mk.Models.Where(md => md.model == "Grand Cherokee"))
         .Where(mk => mk.make == "Jeep").ToList());

_makeRepository.GetQuery() 返回一个IQueryable ...我们实现了存储库模式

这个查询应该可以正常工作(还没有测试过,是为这个例子创建的)但是我们如何.Include car 表,以便我们的函数返回 Make entity objects,以便填充 Model 并填充 Cars (获取汽车时出现问题,因为它们没有直接导航属性来制作)

我们正在使用 POCO 对象。

我们的目标是让 1 个函数返回一个 Make 实体以便能够做到这一点:

foreach(Make myMake in makeList)
{
    Response.Write(myMake.make);

    foreach(Model myModel in myMake.Models)
    {
         Response.Write(myModel.model);

         foreach(Car mycar in myModel.Cars)
         {
              Response.Write(mycar.car);
         }
    }
}

这样的事情似乎不可能,但这是我们想要的:

IEnumerable<Make> makeList =  (((ObjectSet<Lot>)_modelRepository.GetQuery())
         .Include(mk => mk.Models.Where(md => md.model == "Grand Cherokee"))
         .Include(c => mk.Models.Cars)
         .Where(mk => mk.make == "Jeep").ToList());

我还尝试在我的 edmx 中创建一个包含所有这些信息的新实体,这样我就可以查询那个对象,但我不断收到错误说必须映射键...我确实在映射中映射了它们选项卡(Visual Studio 2010)...所以我回来尝试让查询正常工作。

【问题讨论】:

    标签: c# entity-framework include navigation objectset


    【解决方案1】:

    我不是 100% 确定,但我相信您将需要像这样创建某种 DTO:

    public MakeModelCarDto
    {
        public IEnumerable<Make> Makes {get; set;}
        public IEnumerable<Model> Models {get; set;}
        public IEnumerable<Car> Cars {get; set;}
    }
    

    那么你将不得不像这样加入表格:

    _makeRepository.GetQuery()
            .Join(_modelRepository.GetQuery(), mk => mk.makeid, mo => mo.makeid, (mk, mo) => new { mk, mo })
            .Join(_carRepository.GetQuery(), @t => @t.mo.modelid, c => c.modelid, (@t, c) => new { @t, c })
            .Where(@t => @t.@t.mk.make == "Jeep" && @t.@t.mo.model == "Grand Cherokee")
            .Select(@t => new MakeModelCarDto
            {
                Makes = @t.@t.mk,
                Model = @t.@t.mo,
                Cars = @t.c
            }).SingleOrDefault();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-28
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多