我正在使用 EF4,并且在我的班级中使用 System.Data.Entity dll。但是,我看不到我的实体导航属性的加载方法。
如何访问此方法?
我正在做的是创建 .NET 的 e 4.0 项目,从数据库创建我的 edmx,右键单击模型 edmx 并生成一个 DBContext。
但是,我可以访问我的上下文的本地属性,我认为这是 EF4 的一个特性。
谢谢。戴姆洛克。
我正在使用 EF4,并且在我的班级中使用 System.Data.Entity dll。但是,我看不到我的实体导航属性的加载方法。
如何访问此方法?
我正在做的是创建 .NET 的 e 4.0 项目,从数据库创建我的 edmx,右键单击模型 edmx 并生成一个 DBContext。
但是,我可以访问我的上下文的本地属性,我认为这是 EF4 的一个特性。
谢谢。戴姆洛克。
对于DbContext
方法,IsLoaded
属性和Load
方法已被移动:
context.Entry(yourEntity)
.Collection(entity => entity.NavigationProperty)
.IsLoaded;
context.Entry(yourEntity)
.Collection(entity => entity.NavigationProperty)
.Load();
Entry
方法: http: //msdn.microsoft.com/en-us/library/gg696578 (v=vs.103).aspx Collection
方法: http: //msdn.microsoft.com/en-us/library/gg671324 (v=vs.103).aspx IsLoaded
属性: http: //msdn.microsoft.com/en-us/library/gg696146 (v=vs.103).aspx Load
方法: http: //msdn.microsoft.com/en-us/library/gg696220 (v=vs.103).aspx 当您编写查询时(所有这些也适用于 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