Fra*_*ein 6 caching entity-framework objectcache
我正在使用Entity Framework 6和ObjectCache来缓存一些不经常更改的实体.但是我在尝试保存缓存的实体时遇到了错误,因为它们是从不同的上下文中检索的.在保存之前,我验证了并且对象的状态已经分离但是在我执行此操作之前无法消除该错误:
public void Save(Product obj)
{
var objInDb = dbContext.Products.Find(obj.Id);
if (objInDb == null)
{
dbContext.Products.Add(obj);
dbContext.SaveChanges();
}
else
{
dbContext.Entry(objInDb).CurrentValues.SetValues(obj);
dbContext.Entry(objInDb).State = EntityState.Modified;
dbContext.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
在实现所描述的解决方案之后修复的原始错误:附加类型为"C"的实体失败,因为相同类型的另一个实体已经具有相同的主键值.如果图中的任何实体具有冲突的键值,则在使用"附加"方法或将实体的状态设置为"未更改"或"已修改"时,可能会发生这种情况.这可能是因为某些实体是新的并且尚未收到数据库生成的键值.在这种情况下,使用"添加"方法或"已添加"实体状态来跟踪图形,然后根据需要将非新实体的状态设置为"未更改"或"已修改".
原始代码是:
if (obj.Id == 0)
{
context.Products.Add(obj);
}
else
{
context.Entry(obj).State = EntityState.Modified;
}
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来处理这个?我真的不喜欢绕过我的缓存并点击数据库来获取对象,因为它对我来说没什么用.
我认为不“击中”数据库的唯一方法是如下所示。请记住,根据您的第一个例外,您已经在其他地方“点击”该实体的数据库。
if (obj.Id == 0)
{
context.Products.Add(obj);
}
else
{
var localProduct = context.Products.Local.FirstOrDefault(x => x.Id == obj.Id);
if (localProduct == null)
{
context.Entry(obj).State = EntityState.Modified;
}
else
{
context.Entry(localProduct).CurrentValues.SetValues(obj);
}
}
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |