在创建表时初始化/添加固定的表项

本文关键字:添加 创建 初始化 | 更新日期: 2023-09-27 18:13:57

我首先使用实体框架代码,并且我有两个表需要在表创建上初始化固定条目。例如:

表A的列:

-Id
-Name

表B的列:

-Id
-Name
在创建表时,我需要为每个表添加以下信息:

For table A:

Id Name
1  "Name_A1"
2  "Name_A2"
3  "Name_A3"
4  "Name_A4"


1  "Name_B1"
2  "Name_B2"
3  "Name_B3"
4  "Name_B4"
5  "Name_B5"
6  "Name_B6"
7  "Name_B7"
8  "Name_B8"

那么如何实现这一点呢?我想过重写方法Seed并在那里添加那些注册表(硬编码),但我不知道它是否是最好的解决方案。也许在开发阶段,重写此方法并将信息添加到表中是一种很好的做法,但是一旦应用程序将部署到客户中,也许最好在开发机器中通过实体框架创建数据库,然后将其导出并导入到客户计算机中,最后用固定条目填充这些表。

在创建表时初始化/添加固定的表项

正如您和Raphaël所提到的,您可以使用Seed()方法:

protected override void Seed(MyContext context)
{
    context.A.AddOrUpdate
    (
        a => a.Name,
        new A { Name="Name_A1" },
        new A { Name="Name_A2" },
        new A { Name="Name_A3" },
        new A { Name="Name_A4" }
    );
    context.SaveChanges();
    context.B.AddOrUpdate
    (
        b => b.Name,
        new B { Name="Name_B1" },
        new B { Name="Name_B2" },
        new B { Name="Name_B3" },
        new B { Name="Name_B4" },
        new B { Name="Name_B5" },
        new B { Name="Name_B6" },
        new B { Name="Name_B7" },
        new B { Name="Name_B8" }
    );
    context.SaveChanges();  
}

使用AddOrUpdate将确保没有重复数据插入到数据库中。第一个参数a => a.Name让EF识别每个实体。标识可以是实体的PK值,但是如果您的DB正在生成这些值,您将不知道该值,因此使用AddOrUpdate将检查Name是否存在。如果没有,将插入一条新记录。如果它确实找到了匹配项,则将更新实体。当然,这取决于您决定使用什么东西来唯一地标识每个实体。

您可以使用EF Migration来实现这一点,首先您应该在powershell控制台使用以下命令在您的项目中启用EF Migration:

Enable-Migration -ContextTypeName yourContextName

上面的命令将创建一个名为Migration的文件夹,然后在配置文件中您可以覆盖seed方法

 protected override void Seed(MyContext context)
 {
        context.tableA.AddOrUpdate(
             p => p.Name,
             new tableA { Name = "Name_A1" },
             new tableA { Name = "Name_A2" },
             new tableA { Name = "Name_A3" },
             new tableA { Name = "Name_A4" }
        );
        context.tableB.AddOrUpdate(
             p => p.Name,
             new tableB { Name = "Name_B1" },
             new tableB { Name = "Name_B2" },
             new tableB { Name = "Name_B3" },
             new tableB { Name = "Name_B4" }
        );
 }

在上面的方法中,您可以定义查找数据,如邮政编码列表,国家列表和....