如何解决实体框架问题与保存时间有关
| 我有一个具有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
,所以如果您不在其他地方调用它,这就是为什么未保存任何更改的原因
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。