2015-08-07 6 views
0

Мне нужно сбросить свой идентификатор (идентификатор) моей таблицы, потому что каждый раз, когда я делаю обновление, я должен начинать свои идентификаторы по 1 из-за того, что они увеличивают его до более чем 60 000 записей каждый раз , Как я могу это сделать?Сущность и проблема с идентификатором sql

using (DailyContext context= DailyContext.Create()) 
{ 
    //cleaning old prices 
    foreach (var price in context.Prices) 
    { 
     context.DeleteObject(price); 
    } 
    context.SaveChanges(); 


    for (int i = 0; i < newElements.Total; i++) 
    { 
     var newPrice = new Price() 
     { 

      Date = newElements.From.AddDays(i), 
      PriceFrom = newElements.Price, 
      TotalNights = newElements.TotalNights, 
      Profit = newElements.Profit 
     }; 
     context.AddToPrices(newPrice); 
    } 

    context.SaveChanges(); 
} 
+0

DailyContext - это тип global :: System.Data.Objects.ObjectContext – ArlanG

+0

Если вы обнаружите, что вам нужно сбросить свои значения Identity, возможно, вы должны изучить, нужна ли вашей таблице изменение дизайна. Возможно, вы должны полностью использовать идентификатор 'bigint' или drop, и использовать' uniqueidentifer' с значением 'newsequentialid()' default. –

+0

Да, это пахнет, но если вам нужно: http://stackoverflow.com/questions/26155856/how-to-reseed-localdb-table-using-entity-framework –

ответ

1

Вместо прохода через и удаление цены по отдельности в EF просто использовать ExecuteSqlCommand для TRUNCATE таблицы.

Это обе очищает (более эффективно, чем DELETE) и сбрасывает значение столбца IDENTITY.

0

Для сброса идентификационной информации вам необходимо сделать это за пределами EF, и вы должны выполнить необработанные запросы. Запрос, который необходимо выполнить, - DBCC CHECKIDENT с параметром RESEED.

using (DailyContext context= DailyContext.Create()) 
{ 
    //cleaning old prices 
    foreach (var price in context.Prices) 
    { 
     context.DeleteObject(price); 
    } 
    context.SaveChanges(); 

    //Reseed the identity to 0. 
    context.Database.ExecuteSqlCommand("DBCC CHECKIDENT (Prices, RESEED, 0)"); 
    //Roll the identity forward till it finds the last used number. 
    context.Database.ExecuteSqlCommand("DBCC CHECKIDENT (Prices, RESEED)"); 

    for (int i = 0; i < newElements.Total; i++) 
    { 
     var newPrice = new Price() 
     { 

      Date = newElements.From.AddDays(i), 
      PriceFrom = newElements.Price, 
      TotalNights = newElements.TotalNights, 
      Profit = newElements.Profit 
     }; 
     context.AddToPrices(newPrice); 
    } 

    context.SaveChanges(); 
} 

EDIT:

Вот версия, которая просто делает это с SqlCommand и не имеет зависимость от Entity Framework.

using (var connection = new SqlConnection(_connectionString)) 
{ 
    connection.Open(); 
    using (SqlTransaction trans = connection.BeginTransaction("PricesCleanup")) 
    using (var command = new SqlCommand("", connection, trans)) 
    { 
     //Reseed the identity to 0. 
     command.CommandText = "DBCC CHECKIDENT (Prices, RESEED, 0)"; 
     command.ExecuteNonQuery(); 

     //Roll the identity forward till it finds the last used number. 
     command.CommandText = "DBCC CHECKIDENT (Prices, RESEED)"; 
     command.ExecuteNonQuery(); 
     trans.Commit(); 
    } 
} 
+0

У меня проблема. Когда вы ссылаетесь на context.Database.ExecuteSqlCommand, которые не работают для меня База данных не отображается, я создаю контекст, используя обратное создание файла edmx из таблицы моей базы данных. Как я могу это сделать? – ArlanG

+0

Я не знаю, почему у вас нет свойства «База данных», но все, что действительно имеет значение, - это просто запустить эти две строки SQL. Я добавил версию, которая просто использует SqlCommand. –

Смежные вопросы