2

我正在使用 EF4,并且在我的班级中使用 System.Data.Entity dll。但是,我看不到我的实体导航属性的加载方法。

如何访问此方法?

我正在做的是创建 .NET 的 e 4.0 项目,从数据库创建我的 edmx,右键单击模型 edmx 并生成一个 DBContext。

但是,我可以访问我的上下文的本地属性,我认为这是 EF4 的一个特性。

谢谢。戴姆洛克。

4

2 回答 2

11

对于DbContext方法,IsLoaded属性和Load方法已被移动:

context.Entry(yourEntity)
   .Collection(entity => entity.NavigationProperty)
   .IsLoaded;

context.Entry(yourEntity)
   .Collection(entity => entity.NavigationProperty)
   .Load();
于 2012-11-13T18:00:09.287 回答
0

当您编写查询时(所有这些也适用于 lambda 语法,顺便说一句)

From a in context.EntitySet.Include("Navigation Property NAme")
select a

一切都将在那里;) .. 或更多导航属性将被填充。

虽然有很多连接可能会很奇怪

你也可以

From a in context.EntitySet.Include("Navigation1.Navigation2.Navigation2")
                           .Include("SomeOtherNavigation")
    select a

其中 navigation1 和 SomeOtherNavigation 是实体集上的导航属性

如果失败,您可以在上下文中打开延迟加载。但它的邪恶imo。此外,当您采用 SOA 方法时,它并不能很好地扩展,因为您需要在了解存储库中的延迟加载之前将其包括在内。

即你在你的存储库中运行查询,通过服务发送东西,然后想要前端的导航属性......到那时它为时已晚,无法延迟加载......EG你正在使用一个不支持的wcf服务使用数据服务。

需要注意的是,您必须在 EntitySet 上使用 Include,它不在 IQueryable<> 上。

一个真实的例子:

   var csg = from ucsg in c.UserCarShareGroups.Include("UserCarShareGroups.User.UserVehicles")
                      where ucsg.User.UserName.ToLower() == userName.ToLower()
                      && ucsg.CarShareGroup.Carpark.Name.ToLower().Equals(carparkName.ToLower())
                      && ucsg.DeletedBy == null
                      select ucsg.CarShareGroup;

(由于某种原因,数据库有区分大小写的排序规则)

另一种方法(也许更相关的是这里) 实体框架 - .Load()的麻烦

但是,我喜欢按我说的方式做,因为它是明确的,而且我确切地知道要提取什么。尤其是在处理大型数据集时。

将我的担忧与 Load() 结合起来的问题的答案在这里: Entity Framework 4 load and include combine

于 2012-11-13T17:43:05.950 回答