【发布时间】:2011-05-30 17:57:04
【问题描述】:
当 Entity Framework 为与多对多关系表连接的两个数据库表(比如说 Table1 和 Table2)生成 ObjectContext 时,它不会为外部参照表创建对象,而是选择在关系的任何一端。所以在 Table1 上你有 EntityCollection<Table2> Table2s,在 Table2 上你有 EntityCollection<Table2> Table1s。在大多数情况下,这实际上非常棒......
但是,在这种情况下,我有一个整数列表,表示应该在 Table1.Table2s 集合中的 Table2 行的数据库 ID。
我看不到使用实体键设置该集合的任何方法,因此我只能将它们选择到 ObjectContext 中,这已经是无缘无故要做的大量工作。我让自己希望 LINQ-to-Entities 能够智能地推迟执行并像我想要的那样在 SQL 服务器上执行它(尽管我的 Where 使用包含,它可能会或可能不会正确转换为 SQL 中的 IN())。所以我可以做到:
table1instance.Table2s.Clear();
var table2sToInclude = context.Table2s.Where(
t =>
listOfTable2DatabaseIds.Contains(t.Id));
但是没有EntityCollection<T>.AddRange(IEnumerable<T>)或任何东西,当然也没有IEnumerable<T>.ToEntityCollection<T>()扩展方法,所以我现在不知道如何处理这些结果。我能做的就是
foreach (var table2 in table2sToInclude)
{
table1instance.Table2s.Add(table2);
}
这看起来很荒谬,我知道会强制进行很多不必要的评估。
有没有一种“正确的”,或者,也许是“不那么蹩脚”的方式来做到这一点?
【问题讨论】:
标签: entity-framework-4 linq-to-entities many-to-many entitycollection addrange