Как переустановить таблицу LocalDB с помощью Entity Framework?
есть ли способ RESEED a LocalDB таблица с использованием EF?
Я бы предпочел не использовать эту команду SQL :
DBCC CHECKIDENT('TableName', RESEED, 0)
FYI: я использую EF 6.1.
большое спасибо.
2 ответов
Я предполагаю, что вы пытаетесь сбросить первичный ключ в таблице? Если да, то нет никакого способа в EF сделать это.
Как вы заявили, вам придется использовать команду SQL, такую как:
context.Database.ExecuteSqlCommand("DBCC CHECKIDENT('TableName', RESEED, 0)")
но я должен спросить, почему вы пытаетесь делать это? Для вас не должно иметь значения, какое значение находится в поле первичного ключа.
С помощью Руи Jarimba приятно ответ, лучше написать метод расширения, как показано ниже, Если вам нужно DBCC CHECKIDENT
везде:
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;
}
}
и наслаждайтесь простым вызовом к нему:
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
}