如何在EF Core Sqlite数据库中强制一个连接?

sqserrrh  于 2023-10-23  发布在  SQLite
关注(0)|答案(2)|浏览(131)

我正在使用SQLite数据库文件来测试我的EF Core应用程序,而不是SQL Server数据库。我遇到了一个问题,因为依赖注入正在传递带有新连接的dbContext的新示例,所以当它试图做某些事情时,例如当创建实体然后试图发送电子邮件时,我会得到一个异常。
事务对象与此命令所关联的连接对象不同。
如何设置我的Startup.cs,使其只传递一个连接?
ConfigureServices()

if (_env.IsDevelopment())
{
    services.AddDbContext<DbContext, InventoryDbContext>(options =>
            options.UseSqlite(sqliteConnectionString, o => o.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery))
            .AddInterceptors(new QueueSaveChangesInterceptor(), new QueueDbTransactionInterceptor()));
}
else
{
    // ...
}

Configure()

if (env.IsDevelopment())
{
    using var scope = app.ApplicationServices.CreateScope();
    Application.SetupContext(scope.ServiceProvider);

    using var context = scope.ServiceProvider.GetRequiredService<InventoryDbContext>();
    context.Database.EnsureDeletedAsync().Wait();
    context.Database.EnsureCreatedAsync().Wait();

    SqliteDbSeeder.SeedTestDatabase(context);
}

我是不是该换个方向思考?

41zrol4v

41zrol4v1#

我解决了我的问题(大部分)。代码不工作还有另一个原因,它与我使用数据库上下文播种数据库的方式有关。这个问题不会阻止我的测试运行和通过,所以我现在将它放在这里,以后可能会回来。

vhmi4jdf

vhmi4jdf2#

警告:通常DbConnection实现aren't thread safe。我不建议这么做。
您可以在UseSqlite中指定唯一的SqliteConnexion,如下所示:

var sqliteConnexion = new SqliteConnection(sqliteConnectionString);
services.AddDbContext<DbContext, InventoryDbContext>(
    (servicesProvider, options) =>
        options.UseSqlite(sqliteConnexion , o => o.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery)
);

您也可以将连接作为服务注入,如:

services.AddSingleton<SqliteConnection>(() => new SqliteConnection(sqliteConnectionString));
services.AddDbContext<DbContext, InventoryDbContext>(
    (servicesProvider, options) =>
        options.UseSqlite(servicesProvider.GetRequiredService<SqliteConnection>(), o => o.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery)
);

相关问题