【发布时间】:2023-03-18 03:35:01
【问题描述】:
对 .NET Core 还是个新手,但我正在尝试将我的连接字符串放在 Appsettings.json 文件中。我正在关注Microsoft document 上的操作方法,我认为我的所有设置都是正确的。
项目将编译并运行,但是当我点击 API 时出现错误
没有为此 DbContext 配置数据库提供程序。
我使用了 EF Core 在我的上下文中放置的连接字符串,只是将其注释掉,因此DbContext 的OnConfiguring 中实际上没有任何内容。这是连接到 Oracle 数据库。
ModelContext.cs
public partial class ModelContext : DbContext
{
public ModelContext()
{
}
public ModelContext(DbContextOptions<ModelContext> options)
: base(options)
{
}
public virtual DbSet<Customer> Customer{ get; set; }
public virtual DbSet<HubToken> HubToken{ get; set; }
public virtual DbSet<Token> Token { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//if (!optionsBuilder.IsConfigured)
//{
// //optionsBuilder.UseOracle("user id=myusername;password=mypassword;data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=myserver)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=*****)))");
//}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Token>().HasNoKey();
modelBuilder.HasAnnotation("Relational:DefaultSchema", "MySCHEMA");
}
Appsettings.json
"ConnectionStrings": {
"DbConnection": "user id=myusername;password=mypassword;data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=servername)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=***)))"
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddDbContext<ModelContext>(options => {
options.UseOracle(Configuration.GetConnectionString("DbConnection"));
});
}
更新
调用 ModelContext 的代码。我最初使用注释掉的“使用”语句来创建上下文。这就是我在 .Net Framework 中的做法,但 Core 似乎有所不同。然后根据一些建议,我尝试使用 using 语句尝试将连接字符串传递给 ModelContext,但它也不喜欢那样,因为此时连接字符串不可用。在将连接字符串传递给 ModelContext 之前,我已经尝试过先获取连接字符串,但是这也不起作用,我只是不记得它是什么,因为我已经尝试了几件事。我会说,至少目前看来,.Net 的 EF 似乎要简单得多。 DbContext 会帮我从 app.config 或 web.config 获取连接字符串。现在似乎在 Core 中做这件事需要付出更多努力,但这可能只是因为我对 Core 的工作方式还很陌生。
//using (var ctx = new ModelContext())
using (var ctx = new ModelContext(configuration.GetConnectionString("DbConnection")))
{
//Run the query and see if there are any results returned.
var results = ctx.Token.FromSqlRaw(sbQuery.ToString()).ToList();
if (results == null || results.Count == 0)
{
_logger.LogInformation("Api-Token not found in database. Access denied. Customer: {0} | Token: {1}", customer.ToString(), token.ToString());
context.Result = new BadRequestObjectResult("Access Denied. Invalid Token");
return;
}
if (!context.ModelState.IsValid)
{
_logger.LogInformation("Model is in-valid.");
context.Result = new BadRequestObjectResult(context.ModelState);
}
_logger.LogInformation("Api-Token is valid.");
return;
}
【问题讨论】:
-
你能把你的整个
ModelContext班级发上来吗? -
我在帖子中添加了ModelContext代码。
-
把
public ModelContext()方法注释掉怎么样?只保留ModelContext(DbContextOptions<ModelContext> options)。 -
@Bemn 我尝试将其注释掉,但它需要它。没有它就无法构建。
-
到目前为止,您的代码没有任何问题。请显示使用
ModelContext类的代码/类,包括它如何获取类的实例,例如通过使用构造函数依赖注入,或GetService()或new ModelContext()。看起来您使用的ModelContext类实例与您之前通过services.AddDbContext<ModelContext>()调用设置的实例不同。
标签: c# asp.net-core .net-core entity-framework-core connection-string