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

本文关键字:实体 框架 问题 保存 时间 | 更新日期: 2023-09-27 17:57:55

我有一个具有ObjectContext的对象。在保存该对象时,我正在使用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中分离(这样它就可以变成一个二进制对象,而无需遍历所有LazyLoaded对象)。

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

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

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

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

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

几点:

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