我的实体框架背景:
public class MyContext : DbContext
{
public DbSet<Company> Companies { get; set; }
public DbSet<Contact> Contacts { get; set; }
public DbSet<Event> Events { get; set; }
}
添加对象的方法:
public void AddObject(DbContext context, Type t, object object_to_add)
{
PropertyInfo context_property =
context.GetType().GetProperties()
.Where(p => typeof(IEnumerable).IsAssignableFrom(p.PropertyType)
&& p.PropertyType.GenericTypeArguments.Any()
&& p.PropertyType.GenericTypeArguments.First() == t)
.Single();
DbSet db_set = (DbSet)context_property.GetMethod.Invoke(context, null);
db_set.Add(object_to_add);
}
但是当我尝试将DbSet<>
转换为DbSet
时,代码崩溃了,
我使用反射因为我收到了映射到现有模型的DTO对象(也通过反射),我不想为每个新模型编写一个添加方法(我喜欢40并且该列表呈指数级增长)
块引用
任何解决方案?
答案 0 :(得分:4)
如果您创建通用方法,我认为更容易:
public void AddObject<T>(DbContext context, T object_to_add)
{
context.Set<T>().Add(object_to_add);
}
如上所示,哟可以使用Set<TEntity>
方法。
答案 1 :(得分:2)
在生产环境中使用反射会导致性能不佳。所以 octaviocci 的方法在各个方面都更好。
但是,如果你不能使你的方法通用,你可以尝试
public void AddObject(DbContext context, Type t, object object_to_add)
{
context.Set(t).Add(object_to_add);
}
你得到InvalidCastException
因为
System.Data.Entity.DbSet<TEntity>
未实施System.Data.Entity.DbSet
。
请参阅https://msdn.microsoft.com/en-us/library/gg696460(v=vs.113).aspx
上的定义public class DbSet<TEntity> : DbQuery<TEntity>, IDbSet<TEntity>,
IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable