对所有上下文使用相同的上下文选项?

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

未处理的异常。 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());
c# entity-framework
1个回答
0
投票

方法有很多。

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