Как вставить личность с помощью метода AddOrUpdate в Seed

У меня есть объект, который имеет столбец идентификаторов. Как часть семени данных я хочу использовать определенные значения идентификатора для «стандартных данных» в моей системе. Я не хочу отключать личность. только я хочу установить 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 ");

и проблема не решена.


person Morteza    schedule 14.06.2016    source источник


Ответы (2)


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 ");
person Steve Greene    schedule 14.06.2016
comment
Я меняю AddOrUpdate на Add и AddRange , но не решаю свою проблему. - person Morteza; 14.06.2016
comment
Хорошо, проблема может заключаться в пакетном режиме работы Seeding - каждая из этих команд выполняется отдельно. Посмотрите мое редактирование, чтобы обернуть транзакцию, или вы можете попробовать это: stackoverflow.com/questions/7714812/ - person Steve Greene; 14.06.2016

Хорошее объяснение можно найти здесь:
http://blog.robertobonini.com/2014/10/09/entity-framework-with-identity-insert/

Вы можете решить эту проблему, используя две инкапсулированные области.

person Ronin    schedule 01.10.2016