Добавление индекса для типа данных Geographic в SQL с помощью EF Core 2.2 - PullRequest
0 голосов
/ 23 декабря 2018

Сначала я использую код EF Core 2.2, чтобы создать таблицу со свойством NTS Point.Это прекрасно работает и создает таблицу в SQL с типом данных Geographic.Теперь я хочу сначала проиндексировать этот столбец из кода.Я просто делаю основной:

entity.HasIndex(x => x.Point);

Я получаю следующую ошибку:

Сообщение: System.Data.SqlClient.SqlException: Столбец 'PointColumnName' в таблице 'TableName'имеет недопустимый тип для использования в качестве ключевого столбца в индексе или статистике.

Есть ли способ использовать код первым, чтобы поместить индекс в этот столбец?

1 Ответ

0 голосов
/ 23 декабря 2018

Самый простой способ - настроить скрипт миграции в соответствии с вашими потребностями.Например:

migrationBuilder.Sql(
@"
    UPDATE Customer
    SET Name = FirstName + ' ' + LastName;
");

Или вы можете использовать более полный способ Пользовательские операции миграции

class MyMigrationsSqlGenerator : SqlServerMigrationsSqlGenerator
{
    public MyMigrationsSqlGenerator(
        MigrationsSqlGeneratorDependencies dependencies,
        IMigrationsAnnotationProvider migrationsAnnotations)
        : base(dependencies, migrationsAnnotations)
    {
    }

    protected override void Generate(
        MigrationOperation operation,
        IModel model,
        MigrationCommandListBuilder builder)
    {
        if (operation is CreateSpatialIndexOperation createSpatialIndexOperation)
        {
            Generate(createSpatialIndexOperation, builder);
        }
        else
        {
            base.Generate(operation, model, builder);
        }
    }

    private void Generate(
        CreateSpatialIndexOperation operation,
        MigrationCommandListBuilder builder)
    {
        var sqlHelper = Dependencies.SqlGenerationHelper;
        var stringMapping = Dependencies.TypeMappingSource.FindMapping(typeof(string));

        builder
            .Append("CREATE INDEX ")
            .Append(sqlHelper.DelimitIdentifier(operation.Name))
            ...
            .Append(stringMapping.GenerateSqlLiteral(...))
            .AppendLine(sqlHelper.StatementTerminator)
            .EndCommand();
    }
}

, затем используйте его как

 protected override void OnConfiguring(DbContextOptionsBuilder options)
   => options
        .UseSqlServer(connectionString)
        .ReplaceService<IMigrationsSqlGenerator, MyMigrationsSqlGenerator>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...