Как управлять значениями первичного ключа при заполнении данных с помощью Entity Framework codefirst

Я создаю сайт asp.net mvc4 с использованием entity framework 5 с codefirst и sql server express 2012.

Я включил миграции и теперь делаю это в моем методе Configuration.Seed: (обратите внимание, что я хочу установить для первичного ключа значение 8, хотя это первая запись в базе данных).

context.ProductCategoryDtoes.AddOrUpdate(x => x.Id,
    new ProductCategoryDto() { Id = 8, Name = "category1" }
);

Мой объект модели определяется следующим образом:

[Table("ProductCategory")]
public class ProductCategoryDto {
    public long Id { get; set; }
    public string Name { get; set; }
}

Это приводит к созданию таблицы в (SQL SERVER EXPRESS 2012), в которой столбец Id имеет Identity = true, Identity seed = 1, приращение идентификатора = 1.

Теперь, когда я запускаю миграции, выполнив PM> Update-Database этот результат в строке с Id = 1.

Итак, мой вопрос:

1) Как я могу контролировать значения автоматически увеличиваемых первичных ключей при заполнении данных.

2) Если решение состоит в том, чтобы увеличить начальное значение ключевых столбцов, то как это сделать, когда я использую Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>());. Это приведет к сбою и восстановлению базы данных каждый раз, когда я обновляю базу данных, поэтому как будет обновляться начальное значение в новой базе данных?


person Stig Schmidt Nielsson    schedule 03.10.2012    source источник


Ответы (4)


Просто создайте фиктивные сущности со значениями по умолчанию, затем добавьте свои реальные данные, а затем удалите фиктивные. Не лучший способ, но, думаю, другого нет ...

person Sym Phys    schedule 05.10.2012

Вы пробовали добавить это поверх своего свойства Id:

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public long Id { get; set; }
person Admir Tuzović    schedule 04.10.2012
comment
нет, но это мне не поможет, потому что я все еще хочу использовать Identity (автоинкремент), я просто хочу начать с другого начального числа, кроме 0. - person Stig Schmidt Nielsson; 04.10.2012

Похоже, вы пытаетесь обойти цель столбца идентичности. Если вы хотите сделать это, ваш единственный выбор - использовать команды SQL Установить IDENTITY_INSERT, чтобы вы могли вставить значение и затем запустить DBCC CHECKIDENT для обновления семя. Не очень хорошая идея. Эти параметры имеют ограничения по безопасности и производительности.

Вместо этого вы можете рассмотреть возможность использования GUID. Вы можете создавать идентификаторы GUID в коде, который гарантированно будет уникальным, а также можете сгенерировать идентификаторы GUID в SQL в качестве столбца по умолчанию.

С GUID, которые не являются последовательными, вам нужно будет продумать хорошую стратегию индексирования. Этот подход тоже спорен.

В конечном итоге похоже, что вам нужна другая стратегия, кроме использования столбца идентичности.

person Spevy    schedule 03.10.2012
comment
Я хочу контролировать Id, потому что я переношу данные из базы данных MySql на сервер Sql. - person Stig Schmidt Nielsson; 03.10.2012

Это очень хакерский метод, но я столкнулся со сценарием, когда мне пришлось это сделать из-за того, что в каком-то отчете были жестко заданы значения PK. Исправление отчетов выходило за рамки моей работы.

Context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.ProductCategoryDto ON " +
     "INSERT INTO dbo.ProductCategoryDto (Id, Name) VALUES (8, 'category1') " +
     "SET IDENTITY_INSERT dbo.ProductCategoryDto OFF");
person Nate Bolam    schedule 23.12.2013