Неожиданное изменение значения после savechanges()

Я пытаюсь сохранить значение в БД на основе Entity Framework через Visual Studio 2013 в С#.

Я должен сэкономить на аукционных данных БД. У каждого аукциона есть свой идентификатор, int, который является его первичным ключом.

Когда я пытаюсь добавить аукцион в БД, я делаю следующее:

using(var c = new AuctionSiteContext(ConnectionString)
{
var auction = new Database.Auction
       {
              Id = auctionId,    //auctionId=0
              /*
              other stuff
              */
       };
c.Auctions.Add(auction);
c.SaveChanges();
}

Проблема в том, что для аукциона Id установлено значение 0, и я проверил его с помощью отладчика, но когда я выполняю saveChanges(); и снова контролируйте значение этого единственного аукциона на сайте, его идентификатор был изменен на 1.

Я честно не понимаю, почему вызов savechanges() может изменить это значение, потому что в столбце аукциона в базе данных нет ограничений, я имею в виду, почему это не может быть просто 0?

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

изменить: я решил начать последовательность с 0, вот что это значит. Но я даже пытался начать с 1, то есть у первого аукциона id=1, а потом после сохранения стало 2.


person Sanci    schedule 06.01.2015    source источник
comment
Что на самом деле означает Id=0?? Звучит как плохое архитектурно-дизайнерское решение...   -  person walther    schedule 06.01.2015


Ответы (2)


В случае, когда ключевое поле является целым числом, Code First по умолчанию имеет значение DatabaseGeneratedOption.Identity. Итак, если вы хотите добавить свои собственные значения идентификатора, вам необходимо настроить класс сущности. Есть два способа сделать это:

Используя аннотации к данным:

[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Key]
public int Id { get; set; }

Используя Fluent API:

В вашем контексте переопределите метод OnModelCreating и сделайте следующее:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Entity<Auction>()
  .HasKey(t => t.Id)
  .Property(t => t.Id)
  .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}
person octavioccl    schedule 06.01.2015
comment
Первый способ помог! Это означает, что ключ, если он является целым, автоматически устанавливается как автоинкремент? Потому что я пытался не устанавливать идентификатор вручную, и фактически он был добавлен автоматически. - person Sanci; 06.01.2015

Это может произойти, если Id является столбцом с автоинкрементом в вашей базе данных. Когда вы сохраняете его в базе данных, база данных помещает свое собственное значение в этот столбец, и ваша модель EntityFramework автоматически обновляется соответствующим образом.

person AJ Richardson    schedule 06.01.2015
comment
Где я могу проверить, является ли это автоинкрементом? - person Sanci; 06.01.2015
comment
@Sanci Если у вас есть доступ к базе данных, проверьте тип столбца, чтобы убедиться, что это столбец идентификаторов (SQL Server). Вы также можете проверить сущности для БД и посмотреть, является ли она DatabaseGenerated - person Matthew Verstraete; 06.01.2015