2014-10-02 25 views

Odpowiedz

14

Zakładam, że próbujesz zresetować klucz podstawowy na stole? Jeśli tak, to w EF nie ma takiej możliwości.

Jak można stwierdzić, trzeba by użyć polecenia SQL, takich jak:

context.Database.ExecuteSqlCommand("DBCC CHECKIDENT('TableName', RESEED, 0)") 

Ale muszę zapytać, dlaczego starasz się to zrobić tak? Nie powinno mieć znaczenia, jaka wartość znajduje się w polu klucza podstawowego.

+0

Thanks @ Darren, pokazywałem klucz podstawowy jako numer rekordu w DataGridView, więc chciałem RESEED Tabele. –

+1

wcześniej wywoływałbym skrócone (context.Database.ExecuteSqlCommand ("TRUNCATE TABLE [TableName]");) lub usuń (context.Database.ExecuteSqlCommand ("DELETE FROM [TableName]");) aby wymazać stare wartości nie będziesz mieć żadnych duplikatów. –

0

Dzięki Rui Jarimba miło answer, to lepiej napisać metodę rozszerzenia jak poniżej, jeśli potrzebujesz DBCC CHECKIDENT wszędzie:

public static class ContextExtensions 
{ 
    public static void DbccCheckIdent<T>(this DbContext context, int? reseedTo = null) where T : class 
    { 
     context.Database.ExecuteSqlCommand(
      $"DBCC CHECKIDENT('{context.GetTableName<T>()}',RESEED{(reseedTo != null ? "," + reseedTo: "")});" + 
      $"DBCC CHECKIDENT('{context.GetTableName<T>()}',RESEED);"); 
    } 

    public static string GetTableName<T>(this DbContext context) where T : class 
    { 
     var objectContext = ((IObjectContextAdapter) context).ObjectContext; 
     return objectContext.GetTableName<T>(); 
    } 

    public static string GetTableName<T>(this ObjectContext context) where T : class 
    { 
     var sql = context.CreateObjectSet<T>().ToTraceString(); 
     var regex = new Regex(@"FROM\s+(?<table>.+)\s+AS"); 
     var match = regex.Match(sql); 
     var table = match.Groups["table"].Value; 
     return table; 
    } 
} 

I cieszyć się prostą rozmowę do niego:

using (var db = new LibraryEntities()) 
{ 
    db.DbccCheckIdent<Book>(); //which Book is one of your entities 
    db.DbccCheckIdent<Book>(0); //if you want to pass a new seed 
}