【问题标题】:Attach list to db with linq to sql使用 linq to sql 将列表附加到 db
【发布时间】: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


【解决方案1】:

我不知道是否有更好的解决方案,但我认为这会很好:

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

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

【讨论】:

  • 我会试试看 - 它似乎更干净一些
  • 通常假设您在数据库中没有主键为 0 的记录......在编程术语中,这被称为“幻数”......它通常被认为是不好的做法。但是,如果您可以确定 0 的键永远不会发生,它就会起作用。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多