使用数据库迁移插入固定记录,特别是 table 使用 entity framework

Using database migration insert fixed records in particular table using entity framework

我的 MySQL 数据库中有 table 属性,我的要求是它应该有带有一些默认值的固定记录。我希望 table 应该在 Entity Framework 的代码优先方法中借助迁移自动填充。我是第一次处理移民问题,所以我同样需要帮助。

我目前的迁移如下:

public override void Up()
        {
            CreateTable(
                "dbo.properties",
                c => new
                    {
                        id = c.Int(nullable: false, identity: true),
                        property_name = c.Int(nullable: false),
                        value = c.String(nullable: false, maxLength: 255, storeType: "nvarchar"),
                        type = c.Int(nullable: false),
                    })
                .PrimaryKey(t => t.id)
                .Index(t => t.property_name, unique: true, name: "uk_property_name");

        }

        public override void Down()
        {
            DropIndex("dbo.properties", "uk_property_name");
            DropTable("dbo.properties");
        }

迁移有一个 Seeding Mechanism 来填充数据。由于每次 update-database 时都会运行此方法,因此您希望确保不会多次插入数据。这就是 AddOrUpdate 命令的用途,尽管在更复杂的情况下您可以只使用标准 LINQ:

if (!context.MyTable.Any(t => t.Id == "seedId") { // insert };

但我会在您的场景中使用 AddOrUpdate:

protected override void Seed(MyContext context)
{
    context.Properties.AddOrUpdate(x => x.Value,
        new Property() { Value = "My Prop Name 1", Property_Name = 1, Type = 1 },
        new Property() { Value = "My Prop Name 2", Property_Name = 2, Type = 2 },
        new Property() { Value = "My Prop Name 3", Property_Name = 3, Type = 1 }
        );
}

请注意,由于您的 id 字段是标识,因此我没有包含它,而是使用 Value 来检查它是否已经存在。如果值可以重复或者您需要控制 Id,您可能需要不同的技术,例如 this.