如何使用Entity Framework重置LocalDB表?

时间:2014-10-02 07:04:58

标签: c# sql entity-framework tsql localdb

有没有办法 RESEED 使用EF的 LocalDB 表?

我不想使用这个SQL命令:

DBCC CHECKIDENT('TableName', RESEED, 0)

仅供参考:我正在使用EF 6.1。

非常感谢。

2 个答案:

答案 0 :(得分:17)

我假设您正在尝试重置桌面上的主键?如果是这样,EF就没有办法做到这一点。

正如您所说,您必须使用SQL命令,例如:

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

但我不得不问你为什么要尝试这样做呢?您的主键字段中的值不重要。

答案 1 :(得分:2)

在Rui Jarimba的漂亮answer的帮助下,如果你需要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
}