我做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()问题?
答案 0 :(得分:3)
错误只是因为您在此处使用的课程UserAccount
显然没有添加到您的上下文CoreContext
中。那里应该有一个属性:
public DbSet<UserAccount> UserAccounts { get; set; }
无论您最终是否使用通用Set<T>
访问者,您仍然必须为您的上下文中的实体定义DbSet
。
那就是说,你绝对不应该在你的回购中创建自己的服务集合。在Startup.cs中使用主服务集注册您的上下文和您的仓库,然后只需将您的仓库注入您需要的地方。 DI框架将使用您的上下文来实例化它,只要您有一个构造函数来获取您的上下文(您似乎)。
并且 说,你应该完全放弃回购。它仍然需要依赖Entity Framework,除了代理Entity Framework方法之外什么也不做。这只是你必须维护和测试的额外事情,没有额外的好处。