我正在从 .NET Core 8.0 中使用
Microsoft.Data.SqlClient
的代码转换为 Microsoft.EntityFrameworkCore
。我有一个连接字符串,可以成功连接到前者的本地 SQL Server Express 数据库。我正在尝试通过实体框架连接到同一个数据库。
我已经在包管理器中使用了
Scaffold-DbContext
命令来生成数据库模型。我在应用程序内的页面控制器中有这个新代码:
using (var context = new MyDatabaseContext())
{
var result = context.Users.Where(u => u.Email.Equals(useremail));
Console.WriteLine(result.Count());
}
如果您从
.Count()
中删除 result
,此代码就可以正常工作,它只会打印出来
Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[MyWebApp.Models.User]
但是,当添加
.Count()
时(我认为这会导致它实际上需要查询数据库?),该行会显示以下错误:
ArgumentException:初始化字符串的格式不符合从索引 0 开始的规范。
我知道这个错误与我的连接字符串存在某种错误有关。但是,正如标题所述,完全相同的连接字符串与
SqlClient
配合得很好。但是,该字符串现在是从 appsettings.json
中提取的(以前它只是硬编码在占位符代码中,这是不好的做法。但我已经解决了与其相关的错误,无法识别该字符串在“ConnectionStrings”列表中的位置appsettings
,所以我很确定它正在使用正确的字符串)。
"Server=.\\SQLEXPRESS;Database=my_database_name;
Trusted_Connection=True;Encrypt=False;Integrated Security=True;"
我试图找出这个连接字符串出了什么问题,或者这个错误是否可能意味着其他什么。我尝试过手动删除
Trusted_Connection=True
和 Encrypt=False
等位,但它们没有任何区别。我还尝试过将 Server=.\\SQLEXPRESS
替换为 Server=localhost\\SQLEXPRESS
或 Server=.
或 Server=localhost
。
编辑:是的,我已经看过这个问题(以及其他人喜欢的问题)。我使用的是 SQL Server 2022 Express,这是该帖子最新版本 10 年后的版本。我已经尝试过该帖子中列出的针对 SQL Server 2012 建议的最接近的解决方案,使用连接字符串
"Server=.\\SQLEXPRESS;Database=my_database_name;Trusted_Connection=True;"
它不会更改错误(我正在使用 Windows 身份验证 AKA 集成安全性,因此我没有使用用户名/密码字段进行数据库登录)。
编辑2:我也尝试过不转义斜线。可视化编辑器指出无效的转义序列
\S
,当我尝试运行该应用程序时,WebApplicationBuilder
中出现某些问题,然后出现错误
无法连接到网络服务器“https”。网络服务器不再运行
所以我相信转义斜杠是必要的!
通常,Dbcontext MyDatabaseContext 选项中会包含 dbcontext 选项,您可以设置连接字符串。
我建议你可以重新检查你的 MyDatabaseContext。
public class ApplicationDbContext :DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
并确保您已设置好连接字符串。
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
然后在控制器内部或者其他地方,你应该使用依赖注入而不是直接new dbcontext。
如下:
public class HomeController : Controller
{
private readonly ApplicationDbContext _applicationDbContext;
public HomeController( ApplicationDbContext applicationDbContext )
{
_applicationDbContext = applicationDbContext;
}
public IActionResult Index()
{
var result = _applicationDbContext.Users.Where(u => u.Email.Equals(useremail));
Console.WriteLine(result.Count());
return View();
}
}