Миграция существующей дисковой таблицы в таблицу, оптимизированную для памяти - PullRequest
0 голосов
/ 16 мая 2019

Мы разрабатываем веб-приложение, используя ASP.NET MVC Core и EntityFramework Core для доступа к данным. Версия ядра .net - 2.2. Теперь мы пытаемся использовать MemoryOptimizedTables в SQL Server 2016 для наших существующих таблиц.

Я добавил следующую строку в методе OnModelCreating modelBuilder.Entity<MailLog>().ForSqlServerIsMemoryOptimized(); затем я выполнил Add-Migration это привело к файлу миграции ниже.

public partial class DataModel_v0711 : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropPrimaryKey(
                name: "PK_Core_MailLogs",
                table: "Core_MailLogs");

            migrationBuilder.AlterDatabase()
                .Annotation("SqlServer:MemoryOptimized", true);

            migrationBuilder.AlterTable(
                name: "Core_MailLogs")
                .Annotation("SqlServer:MemoryOptimized", true);

            migrationBuilder.AddPrimaryKey(
                name: "PK_Core_MailLogs",
                table: "Core_MailLogs",
                column: "Id")
                .Annotation("SqlServer:Clustered", false);
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropPrimaryKey(
                name: "PK_Core_MailLogs",
                table: "Core_MailLogs");

            migrationBuilder.AlterDatabase()
                .OldAnnotation("SqlServer:MemoryOptimized", true);

            migrationBuilder.AlterTable(
                name: "Core_MailLogs")
                .OldAnnotation("SqlServer:MemoryOptimized", true);

            migrationBuilder.AddPrimaryKey(
                name: "PK_Core_MailLogs",
                table: "Core_MailLogs",
                column: "Id");
        }
    }

И я выполнил команду Update-Database. Я пытался с пустой базой данных. Я пытаюсь взять скрипт миграции с помощью следующей команды.

dotnet ef migrations script  --idempotent -o c:\test\migrate2_1.sql --project EntityFrameworkCore.csproj --startup-project Web.Mvc.csproj

Каждый раз, когда я получаю следующую ошибку.

System.InvalidOperationException: To set memory-optimized on a table on or off the table needs to be dropped and recreated.
   at Microsoft.EntityFrameworkCore.Migrations.SqlServerMigrationsSqlGenerator.Generate(AlterTableOperation operation, IModel model, MigrationCommandListBuilder builder)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.Generate(MigrationOperation operation, IModel model, MigrationCommandListBuilder builder)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.Generate(IReadOnlyList`1 operations, IModel model)
   at Microsoft.EntityFrameworkCore.Migrations.SqlServerMigrationsSqlGenerator.Generate(IReadOnlyList`1 operations, IModel model)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.GenerateUpSql(Migration migration)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.GenerateScript(String fromMigration, String toMigration, Boolean idempotent)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.ScriptMigration(String fromMigration, String toMigration, Boolean idempotent, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScriptMigration.c__DisplayClass0_1.b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.c__DisplayClass3_0`1.b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
To set memory-optimized on a table on or off the table needs to be dropped and recreated.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Проверьте мое решение на

https://www.red -gate.com / простой разговор / SQL / T-SQL-программирование / превращающего базы данных памяти OLTP /

Решение бесплатно! На основе вашей дисковой базы данных будет создана база данных InMemory. Нет необходимости в ручном обновлении.

0 голосов
/ 16 мая 2019

Похоже, что Entity Framework недостаточно умен, чтобы генерировать такой скрипт для перемещения данных. Пожалуйста, попробуйте:
1. Создайте новую пустую базу данных, используя EF.
2. Используйте сравнение схемы Visual Studio или другой инструмент, такой как RedGate, для генерации скрипта изменения. Вы также можете создать его вручную.
3. Обновите базу данных вручную (или используйте ручные миграции)

...