使用linq将列表附加到db到sql

时间:2014-06-29 20:06:58

标签: c# .net sql-server entity-framework linq-to-sql

我的问题是我正在尝试将List<>附加到数据库中的表中。此列表中的某些项&lt;&gt;包含主键 - 这些项应被视为数据库的更新。有些项目没有主键 - 这些项目应该插入到数据库中。

我试过

  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 个答案:

答案 0 :(得分:0)

我不知道是否有更好的解决方案,但我认为这样可以正常工作:

foreach(var item in myList)
{
   if(item.Id > 0)
      context.Entry(item).State = EntityState.Modified;          
   else
      context.Table.Add(item);
}

通过这种方式,您无需从数据库中获取所有旧项目。

答案 1 :(得分:0)

http://msdn.microsoft.com/en-us/library/hh846520(v=vs.103).aspx

你需要使用ObjectContext而不是DbContext我认为这取决于你如何构建你的上下文。