使用附加Linq到Sql和存储过程

时间:2009-12-11 17:05:03

标签: c# linq

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

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

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

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

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

有没有人有使用Attach方法的经验,以及如何使用查询语法更新不一定来自数据上下文的实体(即在这种情况下是存储过程)?

非常感谢

4 个答案:

答案 0 :(得分:1)

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

  1. 从DataContext获取对象并关闭DataContext
  2. 进行更改并进行映射
  3. 从要保存的DataContext中检索对象
  4. 使用映射对象中的值更新该对象
  5. 的SubmitChanges
  6. 或者,当你说你正在使用proc因为你需要在检索它的同时更新一个属性时,我需要查看proc,但是如果你在检索信息后以某种方式提交了这个更新,然后确实消息“未找到或未更改行”是正确的。这很难做到,但如果您将数据加载到临时表,执行更新,然后使用临时表中的选择来填充对象,则可以执行此操作。您可以尝试的一件事是在L2S设计器中将该属性设置为AutoUpdate = Never,看看是否会导致问题消失。如果是这样,这就是你的问题。

答案 1 :(得分:0)

1:它是相同的数据上下文,和 2:它是同一个实体实例(或看起来像它的那个)

这只会发生在同一个数据环境中,我怀疑。如果它是同一个实体,那么它已经存在;只需致电SumbitChanges。否则,使用第二个数据上下文或分离原始实体。

答案 2 :(得分:0)

因此,如果我通过存储过程检索实体,是否会被datacontext跟踪?

事情是..我将从数据模型转到另一个组件使用的另一个模型,然后再返回。它不是......实际上是相同的实例,但它具有所有相同的属性。

IE

    public Models.Tag GetEntity()
            {
                var dbTag = db.PROJ_GetEntity((int)EntityStatuses.Created, (int)EntityStatuses.CreatingInApi).SingleOrDefault();
                return FromDb Entity(dbEntity);
            }


var appModel = GetEntity(); // gets an Entity from a stored proc (NOT GetEntity_RESULT)

appModel.MakeSomeChanges();

_Repo.Persist(appModel);

public void Persist(Models.AppModel model)
{
var dbEntity = Mapper.Map(model);
db.Attach(dbEntity);
db.SubmitChanges();
}

这有点像伪代码......但它几乎正是我正在做的事情。

由于

答案 3 :(得分:0)

我赞成weenet的答案,因为他是对的 - 你不能使用Attach来应用这些变化。

与Entity Framework不同,如果之前从未附加过L2S对象,则只能将它附加到datacontext中 - 即它是要插入表中的新实体。

这确实在多层环境中引起了许多问题 - 但是我已经能够通过创建使用反射和表达式树的通用实体同步系统来解决许多问题。

修改对象后,我针对来自DC和修改对象的新对象运行动态委托,以便在生成Update语句之前仅在DC中跟踪差异。但是,相关实体会有点棘手。