c# - 在 DbContext 的子类中使用反射调用 DbSet<Type>.Add() 方法

标签 c# entity-framework dynamic reflection dbcontext

我有一个 DbContext 子类,它通过 Entity Framework 与数据库进行通信。我正在使用 MVC C#。

我有 n 个与我的表相关的 DbSet。我想调用任何 DbSet.Add(entityObject) 的 Add 方法,在本例中使用反射或动态变量 UserAccounts.Add(entityUserAccount)

我这样做是因为我需要通过 Controller 中的依赖项注入(inject)来注入(inject) DbContect。

public class DataContext: DbContext
{
     public DbSet<UserAccount> UserAccounts { get; set; }

     public void Insert<TypeEntity>(TypeEntity entity) where TypeEntity : BaseEntity
     {
        var typesToRegister = typeof(DataContext).GetProperties().
                     Where(p => p.PropertyType == typeof(DbSet<TypeEntity>));

        //This is where the code explodes in face:-)
        //Please let me know how to fix it
        var dbSetItem = typesToRegister.First();
        var methodAdd = dbSetItem.GetType().GetMethod("Add");
        methodAdd.Invoke(this, new TypeEntity[] { entity });
     }
}


//Insert<TypeEntity>(TypeEntity entity) is my service 
//method to invoke the DbSet<T>.Add() method.

这是我得到的错误:对象引用未设置到对象的实例。 enter image description here

最佳答案

我修复了你的代码。有两个错误:

  1. 而不是

var methodAdd = dbSetItem.GetType().GetMethod("Add");

你应该写:(因为 dbSetItem.GetType() 将返回 propertyType 而不是你期望的字段类型)

dbSetItem.GetValue(this).GetType().GetMethod("Add");

  • 并更改此行(因为应该以这种方式调用 Add 方法:db.Items.Add(...) 而不是 db.Add(...))
  • methodAdd.Invoke(this, new TypeEntity[] { entity> });

    致那个人:

    methodAdd.Invoke(dbSetItem.GetValue(this), new TypeEntity[] { entity> });

    您是否忘记在代码末尾调用 SaveChanges 方法?

        public void Insert<TypeEntity>(TypeEntity entity) where TypeEntity: BaseEntity
        {
            var typesToRegister = typeof(DataContext).GetProperties().
                         Where(p => p.PropertyType == typeof(DbSet<TypeEntity>));
    
            var dbSetItem = typesToRegister.First();
    
            var methodAdd = dbSetItem.GetValue(this).GetType().GetMethod("Add");
            methodAdd.Invoke(dbSetItem.GetValue(this), new TypeEntity[] { entity });
            SaveChanges();
        }
    

    关于c# - 在 DbContext 的子类中使用反射调用 DbSet<Type>.Add() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31395276/

    相关文章:

    c# - CustomValidator 验证多个控件

    c# - 将 Try Catch block 与 ELMAH 一起使用

    c# - EF6 一对多流畅映射

    c# - 我什么时候应该创建一个新的 DbContext()

    C# 动态执行函数的名称?

    javascript - 如果浏览器窗口处于特定宽度,如何使 div 不显示?

    c# - 使用 C# 进行动态 SQL Server 访问的建议

    c# - ASP.net Session_Start 方法中的依赖注入(inject)

    c# - B-Trees/B+Trees 和重复键

    c# - 一对零或一关系的 Entity Framework (EF) 代码优先级联删除