使用 EF 核心代码优先在不同的文件组中创建 Table

Create a Table in different File-group with EF core code-first

我想在之前在 SQL Server 2016 中创建的“辅助”文件组 中创建一个 table。我想使用 EF 核心代码优先 .

创建此 table

终于找到解决办法了,分享给大家。

  1. 在创建 Table 或在您的 ApplicationDbContext 中添加您的 Table 的 DbSet 之前,请在 PMC 中使用此代码创建一个空迁移。
PM> add-migration CreateSecondaryFileGroup
  1. 编写 SQL 查询以在“Up”方法中创建您的 文件组 及其 物理文件
protected override void Up(MigrationBuilder migrationBuilder)
{
     //create FILEGROUP 
     migrationBuilder.Sql(
         " EXEC('ALTER DATABASE [YourDatabaseName] ADD FILEGROUP [Secondary]')",
         suppressTransaction: true);

     //Create Physical file
     migrationBuilder.Sql(
         "ALTER DATABASE [YourDatabaseName] " +
                "ADD FILE " +
                "( " +
                    "NAME = 'Secondary_Data', " +
                    "FILENAME = '[yourFileDirectory]' " +
                    //for example:
                    //"FILENAME = 'D:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Abby_Data2.mdf' " +
                ") " +
                "TO FILEGROUP Secondary",
                suppressTransaction:true
            );
}

  1. 然后在 PMC 运行 中使用此代码更新您的数据库并创建文件组。
PM> update-database
  1. 现在在 ApplicationDbContext 文件中添加你的 tables 的 DbSet,(我的 table 名称是 Category)
public DbSet<Category> Category { get; set; }
  1. 现在创建一个新的迁移文件,以便在您的特定文件组中的数据库中创建 table 使用 PMC 中的此代码
PM> add-migration CreateCategoryTableInSecondaryFileGroup
  1. 现在,在迁移文件的“向上”方法中,您应该使用SQL 方法添加SQL 查询以“再次创建table 的簇索引” migrationBuilder

创建或移动 table 到另一个文件组的一种解决方案是在特定文件组中创建聚簇索引。 聚簇索引是名称为“PK_Category”

的“Category”table的主键

for more information

protected override void Up(MigrationBuilder migrationBuilder)
{
      migrationBuilder.CreateTable(
      name: "Category",
      columns: table => new
      {
           Id = table.Column<int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
           Name = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
           DisplayOrder = table.Column<int>(type: "int", nullable: false)
       },
       constraints: table =>
       {
             table.PrimaryKey("PK_Category", x => x.Id);
       });
       ///// this below code is the key point
       ///// you should write the below code

       migrationBuilder.Sql(
          "CREATE UNIQUE CLUSTERED INDEX PK_Category ON Category (Id)"+  
          " WITH(DROP_EXISTING = ON) "+
                " ON Secondary"
               , suppressTransaction:true);
}

  1. 最后,运行这段代码更新PMC中的数据库。
PM> update-database