如何在不知道确切类型的情况下更新 DbContext 中的实体?

How to update entities in the DbContext without knowing their exact Type?

我有一个

object elementToUpdate;

我想在我的 DbContext 中更新它。

这似乎是一个很好的起点

public void Update<TEntity>(TEntity entity)
{
    DbContext.Set<TEntity>().Attach(entity);
    DbContext.Entry(entity).State = EntityState.Modified;
    DbContext.SaveChanges();
}

如解释的那样here

我的问题是,我无法正确投射 elementToUpdate。我知道它的名称是字符串的精确类型(例如 "MyEntityType"),但我不知道如何使用反射来转换它 - 或者换句话说如何插入类型参数

DbContext.Set<MyEntityType>() 

来自字符串

"MyEntityType"

感谢您的帮助。

使用其他 Set 重载,它不是通用的并且接受实体类型作为输入,假设您具有对象类型的 程序集限定名称(如果该类型在当前正在执行的程序集中,由其命名空间限定的类型名称 就足够了):

public void Update(object entity, string typeName)
{
    var type = Type.GetType(typeName);
    DbContext.Set(type).Attach(entity);
    DbContext.Entry(entity).State = EntityState.Modified;
    DbContext.SaveChanges();
}

您始终可以使用 DbContext.Set 的非通用版本:

DbContext.Set(ObjectContext.GetObjectType(entity.GetType()))

您不能只使用 entity.GetType(),因为它可以作为代理。这就是 System.Data.Entity.Core.Objects.ObjectContext 需要的原因。