【发布时间】:2014-09-12 06:37:17
【问题描述】:
我有两个用于数据处理的存储库(Cache、EntityFramework)。我想从cache获取实体并在EntityFramework中更新,例如错误代码:
User user = _cacheRepo.Get<User>(2);
user.Name = "Qolzam";
_entityFrameworkRpo.Update<User>(user);
错误
无法附加要更新的实体
但另一方面,此代码有效:
User user = _entityFrameworkRpo.Get<User>(2);
user.Name = "Qolzam";
_entityFrameworkRpo.Update<User>(user);
成功:将实体附加到更新是可以的
[更新]
public T Update<T>(T item, bool commit = true) where T : class , IBaseEntity
{
var entry = this.Entry(item);
if (entry != null)
{
entry.State = EntityState.Modified;
entry.CurrentValues.SetValues(item);
}
else
{
this.Attach(item);
}
this.SaveChanges();
return item;
}
[例外]
System.InvalidOperationException 被捕获
_HResult=-2146233079
_message=附加“Domain.User”类型的实体失败,因为同一类型的另一个实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。
H结果=-2146233079
IsTransient=false
Message=附加类型为“Domain.User”的实体失败,因为另一个相同类型的实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。
来源=实体框架
堆栈跟踪:
在 System.Data.Entity.Core.Objects.ObjectContext.VerifyRootForAdd(布尔 doAttach,字符串 entitySetName,IEntityWrapper WrapperEntity,EntityEntry existingEntry,EntitySet& entitySet,Boolean& isNoOperation)
在 System.Data.Entity.Core.Objects.ObjectContext.AttachTo(字符串 entitySetName,对象实体)
在 System.Data.Entity.Internal.Linq.InternalSet1.<>c__DisplayClassa.<Attach>b__9()
at System.Data.Entity.Internal.Linq.InternalSet1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
在 System.Data.Entity.Internal.Linq.InternalSet1.Attach(Object entity)
at System.Data.Entity.Internal.InternalEntityEntry.set_State(EntityState value)
at System.Data.Entity.Infrastructure.DbEntityEntry1.set_State(EntityState 值)
【问题讨论】:
-
你的
_cacheRepo.Get和_entityFrameworkRpo.Update看起来怎么样? -
@SergeyBerezovskiy _cacheRepo.Get() 是简单的通过 id 从 RuntimeCache 获取对象`如果不存在 id 从 entityframework 获取并插入到缓存和 EntityFramework 更新是简单的更新使用通用存储库asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/…
-
IIRC,您不能在存储库之间共享实体。尝试在 'efRepo' 中更新之前将 'user' 从 'cacheRepo' 中分离出来
标签: c# .net entity-framework caching