初始化字符串的格式不符合规范 - 对 EF 使用与 SqlClient 相同的字符串

问题描述 投票:0回答:1

我正在从 .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”。网络服务器不再运行

所以我相信转义斜杠是必要的!

c# asp.net-core .net-8.0 sql-server-express
1个回答
0
投票

通常,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();
    }
 }
© www.soinside.com 2019 - 2024. All rights reserved.