Вот две опции:
Опции1
Поскольку мы могли запустить команду для создания таблицы, мы могли запустить команду из кода с помощью Process
.
public static IServiceCollection ConfigureSqlCacheFromCommand(this IServiceCollection services)
{
var options = services.BuildServiceProvider().GetRequiredService<IOptions<SqlServerCacheOptions>>();
var process = new Process()
{
StartInfo = new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = $"/c dotnet sql-cache create \"{options.Value.ConnectionString}\" { options.Value.SchemaName } { options.Value.TableName }",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = false,
WindowStyle = ProcessWindowStyle.Normal,
RedirectStandardInput = true,
RedirectStandardError = true
}
};
process.Start();
string input = process.StandardError.ReadToEnd();
string result = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return services;
}
Option2
Для команды dotnet sql-cache
она также вызывает dotnet-sql-cache , и вы можете реализовать код длясоздать таблицу программно.
private static int CreateTableAndIndexes(SqlServerCacheOptions options)
{
using (var connection = new SqlConnection(options.ConnectionString))
{
connection.Open();
var sqlQueries = new SqlQueries(options.SchemaName, options.TableName);
var command = new SqlCommand(sqlQueries.TableInfo, connection);
using (var reader = command.ExecuteReader(CommandBehavior.SingleRow))
{
if (reader.Read())
{
return 1;
}
}
using (var transaction = connection.BeginTransaction())
{
try
{
command = new SqlCommand(sqlQueries.CreateTable, connection, transaction);
command.ExecuteNonQuery();
command = new SqlCommand(
sqlQueries.CreateNonClusteredIndexOnExpirationTime,
connection,
transaction);
command.ExecuteNonQuery();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
return 1;
}
}
}
return 0;
}
Для вызова CreateTableAndIndexes
вы можете реализовать этот метод расширения:
public static IServiceCollection ConfigureSqlCache(this IServiceCollection services)
{
var options = services.BuildServiceProvider().GetRequiredService<IOptions<SqlServerCacheOptions>>();
int result = CreateTableAndIndexes(options.Value);
return services;
}
Для настройки в Startup.cs
services.AddDistributedSqlServerCache(options => {
options.ConnectionString = @"Server=localhost\MSSQLSERVER01;Database=IISWindows;Trusted_Connection=True;";
options.TableName = "CacheFromCommand";
options.SchemaName = "dbo";
});
//services.ConfigureSqlCache();
services.ConfigureSqlCacheFromCommand();
Примечание