0

我有一个具有 ObjectContext 的对象。该对象的 OnSave 我正在使用该 ObjectContext 运行一个操作,如下所示:

public void SaveChangesAction(ObjectContext context)
        {
            // Validate the state of each entity in the context
            // before SaveChanges can succeed.
            foreach (ObjectStateEntry entry in
                context.ObjectStateManager.GetObjectStateEntries(
                EntityState.Added | EntityState.Modified))
            {
                var type = entry.Entity.GetType();
                var RepoBase = typeof(RepositoryBase<myEntityFrameworkObject>);
                MethodInfo mi = RepoBase.GetMethod("GenerateLog");
                MethodInfo constructed = mi.MakeGenericMethod(type);

                constructed.Invoke(this, new object[] { entry.Entity });
            }
        }

在我的“GenerateLog”方法中,我将我的实体从 ObjectContext 中分离出来(这样它就可以在不经过所有延迟加载的对象的情况下变成二进制对象)。

变成二进制对象后,我创建了另一个保存二进制数据的对象(不同类型的)。我打电话this.ObjectContext.AddObject('TableName', myNewObject);

然后我在我之前分离的对象上调用它(entityState 是实体的先前状态):

if (entity.EntityState != entityState)
{
    this.ObjectContext.AddObject(entity.GetType().Name, entity);
}

此时,代码从上面返回到 SaveChangesAction 方法。这些对象现在都不在我的 ObjectContext 中,因此它们都不会保存到我的数据库中。
我知道我已经通过修改影响它们的 ForEach 中的对象做了一些坏事,但是考虑到这是我需要在保存 ObjectContext 之前运行的代码,我不知道该怎么做。

4

1 回答 1

1

几点:

  • 那个倒影有味道。您知道您拥有哪些存储库,因此只需将类型的字典作为查找值。
  • 我想知道你的代码怎么可能运行。如果您在循环内分离实体,它应该修改迭代集合并引发异常。这可以通过调用ToArrayToList在您的状态管理器查询中避免。
  • 您正在迭代添加和修改的实体并分离它们,但之后您总是将实体添加为新实体,而不是更新旧实体,而是尝试插入副本
  • 分离对象将破坏所有关系。我几乎可以肯定,此操作会丢失一些关系更改,并且将对象添加或附加回上下文不会重新创建它们。
  • 该方法ObjectContext作为参数,但您的其他代码片段正在使用this.ObjectContext,因此绝对不清楚这些部分与自身的关系
  • context.SaveChanges如果您不在其他地方调用它,则不是这样,这就是没有保存更改的原因
于 2011-05-28T10:03:09.080 回答