005 Entity Framework Core 2.x datos semilla

005 Entity Framework Core 2.x datos semilla


Id. De artículo de Blog Park:


   modelBuilder.Entity<Province>().HasData(new Province
            {
                ProvinceId = 1,  //此处一定要记得编写主键
                Name = "广东",
                Population = 90_000_000
            });

Agregue una instantánea de datos semilla y ejecute el siguiente comando

Add-Migration AddProvinceData

Podemos observar la clase de migración generada

using Microsoft.EntityFrameworkCore.Migrations;

namespace AspEFCore.Data.Migrations
{
    public partial class AddProvinceData : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.InsertData(
                table: "Province",
                columns: new[] { "ProvinceId", "Name", "Population" },
                values: new object[] { 1, "广东", 90000000 });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DeleteData(
                table: "Province",
                keyColumn: "ProvinceId",
                keyValue: 1);
        }
    }
}

A través de la observación, aprendimos que el significado general de esta clase es que Provinceuna pieza de datos debe escribirse en la tabla.

También podemos generar sql, los siguientes comandos deben ejecutarse para generar sql

script-Migration

La captura de pantalla SQL generada es la siguiente (generada es el script SQL que deben ejecutar todas las clases de migración):

生成的sql
Sql generado

Hay problemas aquí que deben tenerse en cuenta, ya que la clave principal de la tabla en la base de datos aumenta automáticamente, pero especificamos el valor de la clave principal cuando escribimos los datos semilla, por lo que podemos observar que en el script SQL generado, el permiso se activa temporalmente La función de insertar una clave primaria se usa para insertar un valor de clave primaria personalizada, y luego se desactiva la función de permitir que se inserte la clave primaria.

¿Por qué es necesario especificar el valor de la clave primaria en los datos semilla?

Porque se puede asegurar que los miembros del equipo de desarrollo tengan los mismos datos de clave primaria en la misma versión de migración.

Guarde los datos semilla en la base de datos y ejecute el siguiente comando

actualizar base de datos

En este momento, si encontramos que los datos semilla están escritos incorrectamente y necesitamos modificar los datos semilla, ¿qué sucederá?

Datos semilla modificados:

modelBuilder.Entity<Province>().HasData(new Province
{
    ProvinceId = 2,
    Name = "广东省",
    Population = 90_011_002
});

Ejecute add-Migration Edit2

生成了新的种子数据迁移类
Se generó una nueva clase de migración de datos semilla

Descubrimos que EFCore eliminará los datos originales y luego los reescribirá.

Luego, si solo modificamos el contenido, no el ID de la clave principal, EFCore solo generará una descripción de la clase de migración que actualiza estos datos.

new Province()
{
    ProvinceId = 3,
    Name = "江苏省",
    Population = 100_000_001,
    Cities = new List<City>()
    {
        new City(){CityId = 31,Name = "南京"},
        new City(){CityId = 32,Name = "苏州"},
        new City(){CityId = 33,Name = "无锡"}
    }
}

Entonces, cuando agregamos los datos semilla, ¿es posible agregar sus datos relacionados juntos? La
respuesta es no, se informará el siguiente error.

The seed entity for entity type 'Province' with the key value 'ProvinceId:3' cannot be added because it has the navigation 'Cities' set. To seed relationships you need to add the related entity seed to 'City' and specify the foreign key values {'ProvinceId'}.

Lo anterior significa que, debido a la existencia de la clave foránea de Citits, debemos escribir por separado los datos semilla de City y agregar ProvinceIdclaves foráneas a estos datos .

Por lo tanto, debemos especificar el ID de la clave primaria de la tabla primaria en los datos de la tabla secundaria

modelBuilder.Entity<Province>().HasData(
    new Province
    {
        ProvinceId = 2,
        Name = "广东省",
        Population = 90_011_002
    },
    new Province()
    {
        ProvinceId = 3,
        Name = "江苏省",
        Population = 100_000_001,
    }

    );

modelBuilder.Entity<City>().HasData(
    new List<City>
    {
        new City(){ProvinceId =3, CityId = 31,Name = "南京"}
        new City(){ProvinceId =3, CityId = 32,Name = "苏州"},
        new City(){ProvinceId =3, CityId = 33,Name = "无锡"}
    }
    );

Solo escribe como arriba.

还有一种应用场景,City模型中,没有表述外键表关系的字段例如没有ProvinceId,那么我们应该怎么,写入种子数据到数据库中呢?我们可以使用匿名类的方式

modelBuilder.Entity<City>().HasData(
new { ProvinceId = 3, CityId = 31, Name = "南京" },
new { ProvinceId = 3, CityId = 32, Name = "苏州" },
new { ProvinceId = 3, CityId = 33, Name = "无锡" },
new { ProvinceId = 3, CityId = 34, Name = "溧阳" });

执行 add-migration edit3 命令,观察生成的迁移类.

迁移类
迁移类

我们可以发现EFCore 会先移除原本的外键,然后自己创建了主键.

在使用Guid作为主键时,我们一定要使用固定的Guid值,否则每一次迁移生成的Guid都是不一样的.所以我们应该这么做.

 var studentId = new Guid("6F9619FF-8B86-D011-B42D-00C04FC964FF");   //明确一个固定的Id,否则每次迁移的Guid值都是不一样的,不利于团队开发.
            modelBuilder.Entity<Student>().HasData(
                new Student { StudentId = studentId,Name = "张三"}
                );

到此EntityFrameworkCore 入门学习完毕,源码下载地址:

源码下载

Supongo que te gusta

Origin www.cnblogs.com/HelloZyjS/p/12730787.html
Recomendado
Clasificación