我正在处理没有存储库模式的项目。我试图从控制器中分离我的业务逻辑,有点像设置业务层。我执行以下操作以获取所有用户。
的DbContext
public class DatabaseContext : DbContext
{
public DatabaseContext() : base() { }
public DatabaseContext(DbContextOptions options) : base(options) { }
public DbSet<User> Users { get; set; }
public DbSet<OvertimeRequest> OvertimeRequests { get; set; }
public DbSet<HolidayRequest> HolidayRequests { get; set; }
public DbSet<PaymentRequest> PaymentRequests { get; set; }
}
OvertimeRequestBusiness
public class OvertimeRequestBusiness
{
public static OvertimeRequestBusiness Instance { get; } = new
OvertimeRequestBusiness();
public OvertimeRequestBusiness() { }
public async Task<List<User>> GetAllUsersAsync()
{
using (var ctx = new DatabaseContext())
{
var query = ctx.Users;
var res = await query.ToListAsync();
return res;
}
}
}
调节器
[Route("users"), HttpGet]
public async Task<List<User>> GetAllUsers()
{
return await OvertimeRequestBusiness.Instance.GetAllUsersAsync();
}
而我得到的错误是
InvalidOperationException:尚未为此DbContext配置任何数据库提供程序。可以通过覆盖DbContext.OnConfiguring方法或在应用程序服务提供程序上使用AddDbContext来配置提供程序。如果使用AddDbContext,那么还要确保您的DbContext类型在其构造函数中接受DbContextOptions <TContext>对象,并将其传递给DbContext的基础构造函数**
不改变OvertimeRequestBusiness
就是在OnCongfiguring
类的DbContext
方法中设置db连接字符串:
"ConnectionStrings": {
"MyConnectionString": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-1234;Trusted_Connection=True;MultipleActiveResultSets=true"
},
Setting.cs
:
public class Setting
{
public static string ConnectionString { get; set; }
}
Startup.cs
:
Setting.ConnectionString = Configuration.GetSection("ConnectionStrings:MyConnectionString").Value;
但常见的方法是使用DbContext和依赖注入:
DatabaseContext
你的public class DatabaseContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<OvertimeRequest> OvertimeRequests { get; set; }
public DbSet<HolidayRequest> HolidayRequests { get; set; }
public DbSet<PaymentRequest> PaymentRequests { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(Setting.ConnectionString);
}
}
}
构造函数需要指向连接字符串。
改变它
https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext
您的连接字符串位于web.config中
DatabaseContext
我删除了DbContext的默认无参数构造函数,然后在OvertimeRequestBusiness中传递了DbContextBuilderOption作为参数。这对我有用。
OvertimeRequestBusiness现在看起来像这样
public class DatabaseContext : DbContext
{
// Tell DbContext to look for the "MyConnectionString" in .config.
public DatabaseContext() : base("MyConnectionString") { }
public DatabaseContext(DbContextOptions options) : base(options) { }
public DbSet<User> Users { get; set; }
public DbSet<OvertimeRequest> OvertimeRequests { get; set; }
public DbSet<HolidayRequest> HolidayRequests { get; set; }
public DbSet<PaymentRequest> PaymentRequests { get; set; }
}