我有一个 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.
这是我得到的错误:对象引用未设置到对象的实例。
最佳答案
我修复了你的代码。有两个错误:
- 而不是
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/