我正在使用EF4开发一个应用程序并创建了一个通用方法,但是生成了这个错误。
方法:
public Boolean change (T)
{
ctx.ApplyCurrentValues <T> (t.GetType (). Name, t);
return save ();
}
gerendo的错误是这样的:
在ObjectStateManager中找不到具有与提供的对象的键匹配的键的对象。验证提供的对象的键值是否与必须应用更改的对象的键值匹配。
有谁知道如何解决这个问题?
答案 0 :(得分:1)
ApplyCurrentValues
将提供的分离实体的值更新为附加实体。此例外表示您没有使用相同密钥的附加实体。这意味着在调用此方法之前,您没有在同一上下文中从数据库加载实体。
您可以将方法修改为:
public Boolean Change<TEntity>(TEntity entity) where TEntity : EntityObject
{
// Loads object from DB only if not loaded yet
ctx.GetObjectByKey(entity.EntityKey);
ctx.ApplyCurrentValues<T>(entity.GetType().Name, entity);
ctx.SaveChanges();
}
答案 1 :(得分:0)
我不确定您是如何编译的,因为您使用了括号(T)
的括号<T>
并省略了参数t
。那就是:
public Boolean change<T>(T t)
{
ctx.ApplyCurrentValues <T> (t.GetType (). Name, t);
return save ();
}
答案 2 :(得分:0)
假设您打算键入以下内容:
public Boolean change<T> (T t) where T : EntityObject
{
ctx.ApplyCurrentValues<T>(t.GetType().Name, t);
return save();
}
这会失败,因为对象上下文尚未加载您要更新的实体,您必须先从数据库中提取实体。
关于如何使用存根或通过从DB请求具有相同ID的实体,有关SO如何执行此操作的示例,但我还没有看到通用版本。
EntityFramework .net 4 Update entity with a simple method
Entity Framework 4 - Where to put "ApplyCurrentValues" Logic?