2016-07-15 13 views
5

Tôi đang cố gắng sử dụng SqlBulkCopy trong DbContext. Chuỗi kết nối Sql của tôi có UserId và mật khẩu và đó là lý do tại sao để vượt qua đối tượng kết nối với SqlBulkCopy Tôi đang tạo đối tượng SqlConnection có một SqlCredential và truyền đối tượng SqlConnection cho SqlBulkCopy. SqlBulkCopy khởi tạo của tôi trông như dưới đây.C# convert DbContextTransaction thành SqlTransaction

using (var conn = new SqlConnection("", cred)) 
{ 
    using (var bulkCopy = new SqlBulkCopy("",SqlBulkCopyOptions.CheckConstraints | 
SqlBulkCopyOptions.KeepNulls,DbContext.Database.CurrentTransaction)) 
    { 
    // bulkCopy code 
    } 
} 

Nhưng vấn đề ở đây là tham số thứ ba của hàm tạo nên là SqlTransaction. Trong trường hợp của tôi, tôi đã có DbContext của tôi, đó là tranh thủ với Giao dịch Dịch vụ của tôi.

Làm cách nào tôi có thể chuyển đổi DbContextTransaction (DbContext.Database.CurrentTransaction) thành SqlTransaction.

+0

Bằng cách truyền nó sang 'SqlTransaction' có lẽ? –

Trả lời

7

Bạn cần một thể hiện của các dbContext hoặc một IDbTransaction để có được những UnderlyingTransaction:

DbContext:

var bulkCopy = new SqlBulkCopy("", SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.KeepNulls, 
     (myDbContext.Database.CurrentTransaction.UnderlyingTransaction) as SqlTransaction)) ; 

IDbTransaction:

using (IDbTransaction tran = conn.BeginTransaction()) 
{ 
    var bulkCopy = new SqlBulkCopy("", SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.KeepNulls, tran as SqlTransaction); 
} 

SqlTransaction thừa hưởng từ DbTransaction!

Lưu ý:

Theo mặc định, một hoạt động sao chép số lượng lớn được thực hiện như một hoạt động cô lập. Thao tác sao chép hàng loạt xảy ra theo cách được giao dịch không phải là , với không cơ hội cho lăn nó trở lại. Nếu bạn cần khôi phục toàn bộ hoặc một phần bản sao khi xảy ra lỗi, bạn có thể sử dụng giao dịch được quản lý bởi SqlBulkCopy, thực hiện thao tác sao chép hàng loạt trong giao dịch hiện có (như trong ví dụ DbContext và chuyển nó làm tham số là tùy chọn) hoặc được tham gia vào Giao dịch như trong ví dụ về IDbTransaction.

+1

Cảm ơn rất nhiều vì câu trả lời. Hãy để tôi thực hiện sự bình an của mã –