c# - 将 Attach 与 Linq To Sql 和存储过程结合使用

标签 c# linq

我正在尝试使用附加方法更新通过存储过程检索的实体。

存储过程设置为返回一个特定实例,该实例存在于我的 dbml 中。检索按预期工作并返回一个完全填充的对象。我需要使用存储过程的原因是我需要在检索该实体的同时更新该实体的属性。

在我检索到这个实体后,我使用 AutoMapper 将它映射到应用程序另一层中使用的另一个模型。该层执行一些操作,对实体进行更改,然后将其传回存储库进行更新。

存储库将该业务模型转换回数据库模型,并尝试将其附加到数据上下文以利用自动更新。

无论 Attach(entity, true) Attach(entity) 等的组合如何,它都会给我消息,如“未找到或更改行”或“无法添加具有相同主键的实体”。

有没有人对 Attach 方法有任何经验,以及如何使用它来更新不一定来自使用查询语法的数据上下文的实体(即在本例中为存储过程)?

非常感谢

最佳答案

首先,如果您正在创建对象的副本,进行更改,然后尝试将复制的对象附加到与其中包含原始对象的对象相同的 DataContext,那么这可能会导致“无法添加具有相同主键的实体”消息。处理此问题的一种方法是: 1.从DataContext获取对象 2. 进行更改并映射对象(反之亦然 - 无论顺序如何) 3.用另一层中的新值更新原始对象 4. 在包含原始对象的 DataContext 上提交更改

  1. 从 DataContext 中获取对象并关闭 DataContext
  2. 进行更改并进行映射
  3. 从要保存到的 DataContext 中检索对象
  4. 使用映射对象中的值更新该对象
  5. 提交更改

或者,当您说您正在使用 proc 因为您需要在检索它的同时更新属性,我需要查看 proc,但是如果您在检索信息后以某种方式提交此更新,那么消息“未找到或未更改行”确实是正确的。这很难做到,但如果您将数据加载到临时表中,进行更新,然后使用临时表中的选择来填充对象,则可以做到这一点。您可以尝试的一件事是在 L2S 设计器中将该属性设置为 AutoUpdate = Never 并查看是否可以解决问题。如果是这样,这就是你的问题。

关于c# - 将 Attach 与 Linq To Sql 和存储过程结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1889431/

相关文章:

c# - SaveFileDialog 在 Windows XP 中无法返回

c# - 具有 protected setter 的最小起订量属性

c# - Windows Phone 8.1 应用 MediaCapture 下暴露

LINQ Lambda 编写查询的顺序

c# - 自动映射错误: The type does not have a default constructor

c# - NLog - 扩展 Nlog - callsite - dispose()

c# - protobuf-net UseImplicitZeroDefaults 和 Enum 默认值

c# - 匿名类型的 linq 查询

linq - 如何使用 LINQ 对对象列表执行函数

c# - Linq 查询返回 true 或 false