使用数据库迁移插入固定记录,特别是 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.
我的 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.