如何使用实体框架重置LocalDB表
本文关键字:LocalDB 框架 何使用 实体 | 更新日期: 2023-09-27 18:25:27
是否有任何方法可以使用EF重置LocalDB表?
我宁愿不使用这个SQL命令:
DBCC CHECKIDENT('TableName', RESEED, 0)
仅供参考:我使用的是EF 6.1。
非常感谢。
我假设您正在尝试重置表上的主键?如果是这样的话,EF就没有办法做到这一点。
正如您所说,您必须使用SQL命令,例如:
context.Database.ExecuteSqlCommand("DBCC CHECKIDENT('TableName', RESEED, 0)")
但我不得不问你为什么要这么做?主键字段中的值对您来说并不重要。
在Rui 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
}