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

问题描述

| 我有一个具有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中分离出来(这样它就可以被转换为Binary对象,而无需遍历所有Lazy Loaded对象)。 变成Binary对象后,我创建另一个(具有不同类型的)对象来保存Binary数据。我叫
this.ObjectContext.Addobject(\'TableName\',myNewObject);
。 然后在我先前分离的对象上调用方法(entityState是Entity的先前状态):
if (entity.EntityState != entityState)
{
    this.ObjectContext.Addobject(entity.GetType().Name,entity);
}
此时,代码从上方返回到SaveChangesAction方法。这些对象现在都不在我的ObjectContext中,因此它们都不保存到我的数据库中。 我知道我已经通过修改影响它们的ForEach中的对象已经在做一些不好的事情,但是由于这是我在保存ObjectContext之前需要运行的代码,因此我不知道该怎么做。     

解决方法

        几点: 那反射的气味。您知道您拥有的存储库,因此只需将类型作为查询值的字典制作成。 我不知道您的代码怎么可能运行。如果在循环内分离实体,则应修改迭代集合并引发异常。通过在状态管理器查询中调用
ToArray
ToList
可以避免这种情况。 您正在迭代已添加和已修改的实体并分离它们,但是在此之后,您始终将实体添加为新实体,因此您将尝试插入重复的实体而不是更新旧实体 分离对象将破坏所有关系。我几乎可以确定,此操作将丢失一些关系更改,并且将对象添加或附加到上下文将不会重新创建它们。 该方法以
ObjectContext
作为参数,但是您的其他代码段使用的是
this.ObjectContext
,因此绝对不清楚这些部分与自身的关系 没有
context.SaveChanges
,所以如果您不在其他地方调用它,这就是为什么未保存任何更改的原因