【问题标题】:Initializing/Adding fixed entries on table creation在创建表时初始化/添加固定条目
【发布时间】:2023-04-07 22:36:02
【问题描述】:

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

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

【问题讨论】:

  • 你使用 EF 迁移吗?
  • 我是 EF 代码的新手,我不知道 EF 迁移。我没有使用它。如果模型发生变化,我正在使用一个初始化器来删除/创建数据库。无论如何,我会看看。看起来很有趣。
  • 好吧,如果你使用drop/create方式,那么就使用seed方式。通过迁移,您可以在种子中添加初始化代码,也可以在您的迁移之一(向上/向下方法)中添加初始化代码
  • 是的,这很有趣 ;) 但是 EF 5。

标签: c# linq entity-framework ef-code-first


【解决方案1】:

正如您和 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 是否存在。如果没有,将插入一条新记录。如果确实找到匹配项,实体将被更新。当然,您可以决定使用可以唯一标识每个实体的东西。

【讨论】:

  • 我的数据库会自动生成 ID (PK),所以这种方法对我有好处。正如您评论的那样,我已经覆盖了种子方法。另外,我正在研究迁移,因为它看起来也很有趣。非常感谢。
【解决方案2】:

您可以使用 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" }
        );
 }

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

【讨论】:

  • 提供与问题相关的示例代码可能会更好一些,而不是仅仅从您以前使用过的Seed() 方法中粘贴大量代码。
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 2021-05-08
  • 2012-05-23
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
相关资源
最近更新 更多