场景:我想向数据库添加一个具有导航属性和that实体具有导航属性......等等。基本上,数据库中的表都是相互连接的——所有表都是相互连接的。
我使用 EF4.3 和上下文/请求模式,所以我不想启用延迟加载;加载我需要的实体会花费太多时间。到目前为止,我了解到除了使用这样的 include 方法之外,没有其他方法可以做到这一点:
context.Set<TEntity>().include("navproperty1").include("navproperty1.navproperty1.1")... and so on.
这样可维护性会很差,而且代码很多,但是如果我不想为每个实体类型手动编写所有包含内容,还有其他方法吗?
这里有很多问题。我将尝试解决每一点。
首先,延迟加载并不总是更快。特别是如果您正在加载所有关系。
其次,始终避免“魔弦”。我不知道是否Include
接收 lambda 表达式(它是 IQueryable 扩展)的方法可用于 EF 4.3。如果不是,您应该自己实现就像这里所示的 http://www.thomaslevesque.com/2010/10/03/entity-framework-using-include-with-lambda-expressions/并使用:
context.Set<TEntity>().include(t => t.NavProp)
“A”实体与“B”实体具有 1 : n 关系,但“B”实体具有 n : m
与“C”实体的关系。如果我不将“C”包含到“A”中,然后
尝试调用 context.SaveChanges() 那么所有数据都会丢失
“B”和“C”
我实在不知道你的意思。但是,如果您想选择属于列表中某个项目的子导航属性,您应该在 EF 5 中使用它:(不确定它在 4.3 中是否有效)
context.Set<TEntity>().Include(t => t.Collection.Select(c => c.SubProp))
还可以找到其他的表达方式here http://msdn.microsoft.com/en-us/data/jj574232.aspx
如果您澄清那句话,也许我可以提供更多帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)