0

我们正在使用 ASP.NET MVC Core 开发一个 Web 应用程序,并使用 EntityFramework Core 进行数据访问。.net 核心版本是 2.2。现在,我们正在尝试将 SQL Server 2016 中的 MemoryOptimizedTables 用于我们现有的表。

我在 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");
        }
    }

我执行了更新数据库命令。我尝试使用空数据库。我尝试使用以下命令获取迁移脚本。

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

每次我收到以下错误。

System.InvalidOperationException:要在表上或表外设置内存优化,需要删除并重新创建。
   在 Microsoft.EntityFrameworkCore.Migrations.SqlServerMigrationsSqlGenerator.Generate(AlterTableOperation 操作,IModel 模型,MigrationCommandListBuilder 生成器)
   在 Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.Generate(MigrationOperation 操作,IModel 模型,MigrationCommandListBuilder 生成器)
   在 Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.Generate(IReadOnlyList`1 操作,IModel 模型)
   在 Microsoft.EntityFrameworkCore.Migrations.SqlServerMigrationsSqlGenerator.Generate(IReadOnlyList`1 操作,IModel 模型)
   在 Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.GenerateUpSql(迁移迁移)
   在 Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.GenerateScript(String fromMigration,String toMigration,布尔幂等)
   在 Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.ScriptMigration(字符串 fromMigration,字符串 toMigration,布尔幂等,字符串 contextType)
   在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScriptMigration.c__DisplayClass0_1.b__0()
   在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.c__DisplayClass3_0`1.b__0()
   在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(操作动作)
要在表上或表外设置内存优化,需要删除并重新创建表。

谢谢。

4

2 回答 2

0

看起来实体框架不够聪明,无法生成这样的脚本来移动数据。请尝试:
1. 使用 EF 创建全新的空数据库。
2. 使用 Visual Studio Schema compare 或 RedGate 等其他工具生成更改脚本。您也可以手动创建一个。
3.手动更新数据库(或使用手动迁移)

于 2019-05-16T14:53:48.820 回答
0

查看我的解决方案

https://www.red-gate.com/simple-talk/sql/t-sql-programming/converting-database-memory-oltp/

解决方案是免费的!根据您的基于磁盘的数据库,将创建 InMemory 数据库。无需手动更新。

于 2019-05-16T15:07:33.040 回答