在创建表时初始化/添加固定的表项
本文关键字:添加 创建 初始化 | 更新日期: 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" }
);
}
在上面的方法中,您可以定义查找数据,如邮政编码列表,国家列表和....