2014-10-02 14 views

Trả lời

14

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.

+0

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. –

+1

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. –

0

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ác vấn đề liên quan