无法转换类型&System; System.Data.Entity.DbSet`1 [ModelName]'输入' System.Data.Entity.DbSet'

时间:2016-04-12 20:06:49

标签: c# entity-framework reflection

我的实体框架背景:

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并且该列表呈指数级增长)

块引用

任何解决方案?

2 个答案:

答案 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