3

我有一个具有标识列的实体。作为数据种子的一部分,我想在我的系统中为“标准数据”使用特定的标识符值。我不想禁用身份。只有我想在迁移种子中设置 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 没有插入并且身份自动插入

我的 Entityframework 版本是 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 ");

并且问题没有解决。

4

2 回答 2

3

AddOrUpdate 不像标准 LINQ 那样简单(请参见此处)。

我只会使用标准的 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 ");
于 2016-06-14T13:40:56.313 回答
0

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

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

于 2016-10-01T16:00:52.050 回答