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

时间:2015-09-03 11:04:56

标签: c# .net entity-framework reflection dbcontext

我有一个

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"

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

使用其他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();
}