【问题标题】:How to update entities in the DbContext without knowing their exact Type?如何在不知道确切类型的情况下更新 DbContext 中的实体?
【发布时间】:2015-09-03 11:04:55
【问题描述】:

我有一个

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"

感谢您的帮助。

【问题讨论】:

  • 您的代码中是否有 MyEntityType。如果有,您可以使用工厂模式。
  • 你真的需要强制转换它,还是你只是在编译时不知道类型?如果您只是调用Update(elementToUpdate)(没有指定&lt;TEntity&gt;,它应该会根据参数自动为您的模板选择正确的泛型类型。
  • @LInsoDeTeh,如果实体用object 装箱,则TEntity 调用的方法等于object,而不是所需的类型。

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


【解决方案1】:

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

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

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

【讨论】:

  • 我喜欢堆栈溢出,我爱你:)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多