当 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);
}
这看起来很荒谬,我知道会迫使很多不必要的评估。
有没有一种“正确的”,或者,也许是“不那么蹩脚”的方式来做到这一点?