Tôi đang cố gắng xây dựng một thử nghiệm nhanh để xóa và tạo lại cơ sở dữ liệu mỗi khi nó chạy. Tôi có những điều sau đây:Lệnh CREATE DATABASE không được phép trong giao dịch đa lệnh
[TestClass]
public class PocoTest
{
private TransactionScope _transactionScope;
private ProjectDataSource _dataSource;
private Repository _repository = new Repository();
private const string _cstring = "Data Source=.;Initial Catalog=test_db;Trusted_Connection=True";
[TestInitialize]
public virtual void TestInitialize()
{
_dataSource = new ProjectDataSource(_cstring);
_dataSource.Database.Delete();
_dataSource.Database.CreateIfNotExists();
_transactionScope = new TransactionScope();
}
[TestMethod]
public void TestBasicOperations()
{
var item = _repository.AddItem(new Item(){Details = "Test Item"});
// AddItem makes a call through the data context to add a set and then calls datacontext.SaveChanges()
}
[TestCleanup]
public void TestCleanup()
{
// rollback
if (_transactionScope != null)
{
_transactionScope.Dispose();
}
}
Tuy nhiên khi tôi chạy thử nghiệm tôi nhận được lỗi sau:
Result Message: Test method Project.Repository.UnitTests.PocoTest.TestBasicOperations threw exception: System.Data.SqlClient.SqlException: CREATE DATABASE statement not allowed within multi-statement transaction.
ProjectDataSource là ở đây:
public class ProjectDataSource : DbContext, IProjectDataSource
{
public ProjectDataSource() : base("DefaultConnection")
{
}
public ProjectDataSource(string connectionString) : base(connectionString)
{
}
public DbSet<Set> Sets { get; set; }
}
Repository:
public class Repository : IRepository
{
private readonly ProjectDataSource _db = new ProjectDataSource();
public Item AddItem(Item item)
{
_db.Items.Add(item);
_db.SaveChanges();
return item;
}
}
Tại sao điều này lại xảy ra?
Ngoài ra - nếu nó tạo ra bất kỳ sự khác biệt nào - lỗi không xảy ra nếu tôi nhận xét dòng AddItem trong TestMethod.
Tôi không hiểu tại sao vấn đề này lại gây ra. Bạn đang nói rằng việc tạo ra 2 thể hiện dbcontext tương đương gây ra vấn đề. có nghĩa là chỉ một dbcontext cho một db cụ thể mới có thể tồn tại trong ứng dụng? –
Eran Otzap, tôi biết đó là một sự trì hoãn, nhưng đã đối mặt với vấn đề này ngày hôm nay, tôi nghĩ sẽ hữu ích khi xuất bản một câu trả lời giải thích nguyên nhân gốc rễ. Hy vọng nó giúp. –