【问题标题】:Using database migration insert fixed records in particular table using entity framework使用数据库迁移使用实体框架在特定表中插入固定记录
【发布时间】:2017-03-24 08:08:43
【问题描述】:

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

我目前的迁移如下:

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

【问题讨论】:

    标签: c# mysql entity-framework entity-framework-migrations


    【解决方案1】:

    迁移有一个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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      相关资源
      最近更新 更多