如何通过种子

时间:2016-06-14 12:23:02

标签: entity-framework migration seed identity-insert

我有一个拥有标识列的实体。作为数据种子的一部分,我想使用"标准数据的特定标识符值"在我的系统中。 我不想要禁用身份。 只有我想在迁移种子中设置IDENTITY_INSERT ON。

我的代码是:

protected override void Seed(DelphyWCFTestService.Model.DataContext context)
{
    context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] On ");
    context.Cities.AddOrUpdate(
        p => p.CityId,
        new City { CityId = 1, Title = "Paris" }
    );
}

但我的CityId没有自动插入插入和身份

我的实体框架版本是6.1.3

更新

我将我的代码更改为:

context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] On ");
var cities = new List<City>
{
    new City { CityId = 1, Title = "Paris" }
};
context.Cities.AddRange(cities);
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] Off ");

并且问题没有解决。

2 个答案:

答案 0 :(得分:3)

AddOrUpdate并不像标准LINQ(see here).

那样简单

我会使用标准的LINQ:

if (!context.Cities.Any())
{
  using (var transaction = context.Database.BeginTransaction())
  {        var cities = new List<City> 
    {
       new City { CityId = 1, Title = "Paris" },
       new City { CityId = 2, Title = "London" },
       ...
       new City { CityId = 99, Title = "Rome" }
    }
    context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] On ");
    context.Cities.AddRange(cities);
    context.SaveChanges();
    context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] Off ");

    transaction.Commit();
  }
}

如果您要添加到现有城市,您可以逐个测试:

if (!context.Cities.Any(c => c.CityId == 1))
{
    context.Cities.Add(new City { CityId = 1, Title = "Paris" });
}
... repeat for all cities 
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] On ");
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] Off ");

答案 1 :(得分:0)

你可以在这里找到一个很好的解释:
http://blog.robertobonini.com/2014/10/09/entity-framework-with-identity-insert/

您可以使用两个封装的范围来解决问题。

相关问题