2015-01-06 5 views
0

Я пытаюсь сохранить значение в базе данных на основе Entity Framework через visual studio 2013 в C#.Неожиданное изменение значения после savechanges()

Мне нужно сохранить данные на аукционе DB. Каждый аукцион имеет свой собственный id, int, который является его основным ключом.

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

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

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

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

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

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

+0

Что означает 'Id = 0'? Звучит как плохое архитектурное/дизайнерское решение ... – walther

ответ

1

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

Использование Data Annotations:

[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); 
} 
+0

Выполнение первого способа сделало трюк! Это означает, что ключ, если это int, автоматически устанавливается автоматически для автоинкремента? Потому что я пытался не устанавливать вручную идентификатор, и эффективно он был добавлен автоматически. – Sanci

+0

это правильно. Это поведение по умолчанию – octavioccl

4

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

+0

Где я могу проверить, является ли он автоматическим приращением? – Sanci

+0

@Sanci Если у вас есть доступ к базе данных, проверьте тип столбца, чтобы увидеть, является ли он столбцом Identity (SQL Server). Вы также можете проверить сущности для БД и посмотреть, является ли это «DatabaseGenerated» – Matthew