无法为“模型”创建DbSet,因为此类型未包含在上下文的模型中

时间:2018-03-22 09:48:21

标签: asp.net-core dependency-injection

我做Generic并使用DI

所以我创建了一个空类

public class DBRepo
{ 
}

和我继承DBRepo类的模型类

public partial class UserAccount : DBRepo
{
   public int Id { get; set; }
   public string Account { get; set; }
   public string Pwd { get; set; }
}

然后这是一个做CRUD的界面

    public interface IDBAction<TEntity> where TEntity : class,new()
    {   
      void UpdateData(TEntity _entity);
      void GetAllData(TEntity _entity);
    }
public class DBService<TEntity> : IDBAction<TEntity> where TEntity : class,new()
{
    private readonly CoreContext _db;
    public DBService(CoreContext _db)
    {
        this._db = _db;
    }
    public void UpdateData(TEntity _entity)
    {
        this._db.Set<TEntity>().UpdateRange(_entity);
        this._db.SaveChanges();
    }
    public void GetAllData(TEntity _entity)
    {
        var x = this._db.Set<TEntity>().Select(o => o).ToList();
    }
}

我在构造函数中的依赖注入服务提供程序

this.DBProvider = new ServiceCollection()
    .AddScoped<IDBAction<DBRepo>, DBService<DBRepo>>()
    .AddScoped<DBContext>()
    .AddDbContext<CoreContext>(options => options.UseSqlServer(ConnectionString))
    .BuildServiceProvider();

最后一步我获得服务

DBProvider.GetService<IDBAction<DBRepo>>().GetAllData(new UserAccount());

我会收到与标题

相同的错误消息

或者我改为

DBProvider.GetService<IDBAction<UserAccount>>().GetAllData(new UserAccount());

我会收到其他消息

  

对象引用未设置为对象的实例。'

但void UpdateData()可以工作, 那么如何解决GetAllData()问题?

1 个答案:

答案 0 :(得分:3)

错误只是因为您在此处使用的课程UserAccount显然没有添加到您的上下文CoreContext中。那里应该有一个属性:

public DbSet<UserAccount> UserAccounts { get; set; }

无论您最终是否使用通用Set<T>访问者,您仍然必须为您的上下文中的实体定义DbSet

那就是说,你绝对不应该在你的回购中创建自己的服务集合。在Startup.cs中使用主服务集注册您的上下文和您的仓库,然后只需将您的仓库注入您需要的地方。 DI框架将使用您的上下文来实例化它,只要您有一个构造函数来获取您的上下文(您似乎)。

并且 说,你应该完全放弃回购。它仍然需要依赖Entity Framework,除了代理Entity Framework方法之外什么也不做。这只是你必须维护和测试的额外事情,没有额外的好处。