实体框架问题与保存时间有关

时间:2011-05-28 04:08:13

标签: c# entity-framework objectcontext

我有一个具有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中分离它(这样它就可以变成二进制对象而不需要遍历所有的Lazy Loaded对象)。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

几点:

  • 那反射闻起来。您知道自己拥有哪些存储库,因此只需将类型字典作为查找值。
  • 我想知道你的代码怎么可能运行。如果你在循环中分离实体,它应该修改迭代集合并抛出异常。通过在州经理查询中调用ToArrayToList可以避免这种情况。
  • 您正在迭代添加和修改的实体并将它们分离但在此之后您始终将实体添加为新实体,而不是更新您尝试插入重复的旧实体
  • 分离对象会破坏所有关系。我几乎可以肯定,这个动作会丢失关系中的一些变化,并且将对象添加或附加到上下文不会重新创建它们。
  • 该方法以ObjectContext为参数,但您的其他代码段使用this.ObjectContext,因此绝对不清楚这些部分与自身的关系
  • 没有context.SaveChanges所以如果你不在其他地方调用它,那就是没有保存更改的原因