更新对象的通用方法出错(实体框架4)

时间:2011-03-18 02:56:24

标签: c# entity-framework generics entity-framework-4

我正在使用EF4开发一个应用程序并创建了一个通用方法,但是生成了这个错误。

方法:

public Boolean change (T)
{
    ctx.ApplyCurrentValues ​​<T> (t.GetType (). Name, t);
    return save ();
}

gerendo的错误是这样的:

在ObjectStateManager中找不到具有与提供的对象的键匹配的键的对象。验证提供的对象的键值是否与必须应用更改的对象的键值匹配。

有谁知道如何解决这个问题?

3 个答案:

答案 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?