Có cách nào để RESEED a LocalDB Bảng sử dụng EF?Làm thế nào để RESEED Bảng LocalDB bằng cách sử dụng khung thực thể?
Tôi không muốn sử dụng lệnh SQL này:
DBCC CHECKIDENT('TableName', RESEED, 0)
FYI: Tôi sử dụng EF 6.1.
Cảm ơn rất nhiều.
Có cách nào để RESEED a LocalDB Bảng sử dụng EF?Làm thế nào để RESEED Bảng LocalDB bằng cách sử dụng khung thực thể?
Tôi không muốn sử dụng lệnh SQL này:
DBCC CHECKIDENT('TableName', RESEED, 0)
FYI: Tôi sử dụng EF 6.1.
Cảm ơn rất nhiều.
Tôi cho rằng bạn đang cố đặt lại khóa chính trên bảng? Nếu vậy, không có cách nào trong EF để làm điều này.
Như bạn nói, bạn sẽ phải sử dụng một lệnh SQL như:
context.Database.ExecuteSqlCommand("DBCC CHECKIDENT('TableName', RESEED, 0)")
Nhưng tôi phải tự hỏi tại sao bạn đang cố gắng để làm điều này không? Nó không quan trọng đối với bạn giá trị nào nằm trong trường khóa chính của bạn.
Với sự giúp đỡ của Rui của Jarimba đẹp answer, nó tốt hơn để viết một phương pháp khuyến nông như dưới đây nếu bạn cần DBCC CHECKIDENT
ở khắp mọi nơi:
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;
}
}
Và thưởng thức cuộc gọi đơn giản với nó:
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
}
Cảm ơn @ Darren, tôi đã sử dụng để hiển thị khóa chính dưới dạng số bản ghi trong DataGridView, vì vậy tôi muốn RESEED Tables. –
trước đó tôi sẽ gọi một truncate (context.Database.ExecuteSqlCommand ("TRUNCATE TABLE [TableName]");) hoặc delete (context.Database.ExecuteSqlCommand ("DELETE FROM [TableName]");) để xóa các giá trị cũ bạn sẽ không có bất kỳ bản sao nào. –