Как переустановить таблицу 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
}