【发布时间】:2014-06-29 20:06:58
【问题描述】:
我的问题是我试图将List<> 附加到数据库中的表中。此 List 中的某些项目包含主键 - 这些项目应视为数据库的更新。有些项目没有主键 - 这些项目应该插入到数据库中。
我试过了
Context.myTable.AttachAll(myList, true);
Context.myTable.AttachAll(myList, false);
Context.myTable.AttachAll(myList);
都不起作用。所以我会做类似的事情:
var listFromDb = Context.myTable.Where(x => myListOfIds.contains(x.primaryKey));
foreach (var obj in myList)
{
if(obj.primaryKey > 0)
{
Context.myTable.Attach(obj, listFromDb.FirstOrDefault(x => x.primaryKey == obj.primaryKey);
}
else{
Context.myTable.InsertOnSubmit(obj);
}
Context.SubmitChanges();
}
必须有一种更简单的方法,然后遍历列表中的每个项目并手动决定天气或不执行附加或插入。我在这里有什么遗漏吗?
编辑
我在大约 2 年前发现了同样的问题 - Linq To Sql using AttachAll. DuplicateKeyException ,其中的答案基本上就是我的解决方案。有了新的实体 6,以及过去 2 年中添加的所有新东西,现在有办法做我想做的事情吗?
【问题讨论】:
-
当你需要他时,@JonSkeet 在哪里?
-
我不认为 Linq2SQL 可以使用主键来“弄清楚”你的项目的状态。
-
@216 - 它实际上可以,如果你有一个完整的更新列表 - 它知道,如果你有一个完整的 INSERTS 列表 - 它知道,为什么它不能弄清楚逐项逐项。似乎它检查了第一项并假设其余所有项都是相同的
标签: c# .net sql-server entity-framework linq-to-sql