0

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

表 A 的列:

-Id
-Name

表 B 的列:

-Id
-Name

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

对于表 A:

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

对于表 B 应该或多或少相同:

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 并在那里添加那些注册表(硬编码),但我不知道这是否是最好的解决方案。也许在开发阶段覆盖此方法并将信息添加到表中是一个很好的做法,但是一旦将应用程序部署在客户中,也许最好在开发机器中通过实体框架创建数据库,然后执行导出并将其导入客户计算机,最后用固定条目填充这些表。

4

2 回答 2

2

正如您和 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 值,但如果您的数据库正在生成这些值,您将不知道该值,因此使用AddOrUpdate将检查是否Name存在。如果没有,将插入一条新记录。如果确实找到匹配项,实体将被更新。当然,您可以决定使用可以唯一标识每个实体的东西。

于 2013-05-17T17:10:52.060 回答
0

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

Enable-Migration -ContextTypeName yourContextName

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

只需覆盖种子方法:

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

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

于 2013-05-17T17:15:26.937 回答