Если вы начинаете со свежей схемы, то возможно перехватить создание схемы и изменить создание идентификатора. Если схема уже создана (т.е. в расчете на миграцию), то это не так. Например, SQL позволит повторно заполнить идентификатор, но не изменит приращение.
В этом примере используется таблица с именем [Somethings], которая проверяет, когда таблица создана, заменяя «IDENTITY» на IDENTITY (100000,100000), если она найдена. К сожалению, насколько мне известно, в EF 6 перехватчик не может быть присоединен / отсоединен от контекста, поэтому вы можете использовать флаг, чтобы гарантировать, что код проверки / замены перехватчика не запускается все время по умолчанию.
Чтобы перехватить создание схемы:
public class Interceptor : IDbCommandInterceptor
{
void IDbCommandInterceptor.NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{ }
void IDbCommandInterceptor.NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
if (interceptionContext.DbContexts.OfType<SomethingDbContext>().Any(x => !x.ShouldIntercept))
return;
var regex = "NOT NULL IDENTITY,";
var replacement = "NOT NULL IDENTITY(100000,100000),";
if (command.CommandText.StartsWith("CREATE TABLE [dbo].[Somethings]"))
command.CommandText = Regex.Replace(command.CommandText, regex, replacement);
}
void IDbCommandInterceptor.ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{ }
void IDbCommandInterceptor.ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{ }
void IDbCommandInterceptor.ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
{ }
void IDbCommandInterceptor.ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
{ }
}
public class SomethingConfiguration : DbConfiguration
{
public SomethingConfiguration()
{
AddInterceptor(new Interceptor());
}
}
Тогда в вашем DbContext:
[DbConfigurationType(typeof(SomethingConfiguration))]
public class SomethingDbContext : DbContext
{
public bool ShouldIntercept { get; set;} = false;
// .. DbSets, etc.
}
По умолчанию ваш DbContext не будет активно перехватывать команды команд, так как мы действительно хотим активировать эту проверку служебных данных только один раз. Когда ваше приложение запускается, вы можете инициализировать DbContext, установить дляInInIncept значение True, а затем выполнить простой запрос, который обеспечит выполнение проверки / создания схемы DbContext:
using (var context = new SomethingDbContext())
{
context.ShouldIntercept = true;
var test = context.Somethings.Any(); // Triggers schema check/creation.
}