未处理的异常。 System.InvalidOperationException:尚未为此 DbContext 配置数据库提供程序。
这是我注册它们的方法:
var contextOptions = new DbContextOptionsBuilder()
.UseMySql(connectionString, MariaDbServerVersion.LatestSupportedServerVersion)
.UseSnakeCaseNamingConvention();
serviceCollection.AddSingleton(contextOptions);
serviceCollection.AddDbContext<SomeContext>();
当然我可以这样做并且它有效,但我真的必须为每个上下文指定?
serviceCollection.AddDbContext<SomeContext>(options => options.UseMySql(connectionString, MariaDbServerVersion.LatestSupportedServerVersion).UseSnakeCaseNamingConvention());
方法有很多。
lambda 函数
options => options...
可以替换为任何其他函数调用,对参数为 DbContextOptionsBuilder
的实例、本地或静态函数。例如:
void SetMySqlDefaults(DbContextOptionsBuilder options)
{
options.UseMySql(connectionString, MariaDbServerVersion.LatestSupportedServerVersion)
.UseSnakeCaseNamingConvention();
}
...
serviceCollection.AddDbContext<SomeContext>(SetMySqlDefaults);
注册本身可以用扩展方法代替:
static class MySqlContexts
{
public static IServiceColletion AddMySqlContext<T>(this IServiceCollection services)
{
services.AddDbContext<T>(options => options.UseMySql(connectionString, MariaDbServerVersion.LatestSupportedServerVersion).UseSnakeCaseNamingConvention());
return services;
}
}
...
serviceCollection.AddMySqlContext<SomeContext>();
UseMySql返回一个
DbContextOptionsBuilder<T>
,因此设置的rest可以提取到扩展方法中:
public static DbContextOptionsBuilder<T> WithDefaults<T>(this DbContextOptionsBuilder<TContext> builder)
{
return builder.UseSnakeCaseNamingConvention();
}
...
serviceCollection.AddDbContext<SomeContext>(options =>
options.UseMySql(connectionString,
MariaDbServerVersion.LatestSupportedServerVersion
)
.WithDefaults());
UseMySql
还接受配置 lambda,因此可以使用之前的所有技术,例如:
public static MySqlDbContextOptionsBuilder WithMySqlDefaults<T>(this MySqlDbContextOptionsBuilder builder)
{
...
return builder;
}
serviceCollection.AddDbContext<SomeContext>(options =>
options.UseMySql(connectionString,
MariaDbServerVersion.LatestSupportedServerVersion,
WithMySqlDefaults)
.WithMoreGenericDefaults()
);