4

场景:我想向数据库中添加一个实体,该实体将具有导航属性,并且实体具有导航属性......等等。基本上,数据库中的表是相互连接的——所有这些表。

我使用 EF4.3 和上下文/请求模式,所以我不想启用延迟加载;加载我需要的实体只会花费太多时间。到目前为止,我了解到除了使用这样的 include 方法之外没有其他方法可以做到这一点:

 context.Set<TEntity>().include("navproperty1").include("navproperty1.navproperty1.1")... and so on.

这样可维护性会很差,而且代码很多,但是如果我不想为每个实体类型手动编写所有包含,还有其他方法吗?

4

2 回答 2

7

这里有很多问题。我将尝试解决每一点。

首先,延迟加载并不总是更快。特别是如果您正在加载所有关系。

其次,始终避免“魔术字符串”。我不知道Include接收 lambda 表达式(它是 IQueryable 扩展)的方法是否可用于 EF 4.3。如果不是,您应该像这里显示的那样自己实现它并使用:

context.Set<TEntity>().include(t => t.NavProp)

“A”实体”与“B”实体具有 1:n 关系,但“B”实体与“C”实体具有 n:m 关系。如果我不将“C”包含到“A”然后尝试调用上下文。 SaveChanges() 那么所有数据都会在“B”和“C”之间丢失

我真不明白你的意思。但是,如果您想选择属于列表中某个项目的子导航属性,您应该在 EF 5 中使用它:(不确定它是否适用于 4.3)

context.Set<TEntity>().Include(t => t.Collection.Select(c => c.SubProp))

其他表达式可以在这里找到

如果你澄清那句话,也许我可以提供更多帮助。

于 2013-06-25T21:49:43.133 回答
0

看看这个片段

var dbQuery =
context.Letters.Where(letter => letter.ID == myId)
   .Include(l => l.Recipients.Select(y => y.PersonTitle))//this will include letter.Recipients.PersonTitle
   .Include(l => l.PersonTitle)
   .Include(l => l.Rank)
   .Include(l => l.JobTitle);
theLetter = dbQuery.FirstOrDefault();// maybe null returned

这条线

context.Letters.Include(l => l.Recipients.Select(y => y.PersonTitle))

将收到带有它的字母Recipients,您可以访问PersonTitleRecipients 导航属性中存在的字母

那是指带有导航属性的 导航属性

于 2016-10-12T12:57:15.330 回答