Я пытаюсь создать быстрый тест, который удаляет и воссоздает базу данных каждый раз, когда она запускается. У меня есть следующие:Операция CREATE DATABASE не допускается в транзакции с несколькими операциями
[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();
}
}
Однако, когда я запускаю тест я получаю следующее сообщение об ошибке:
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 здесь:
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;
}
}
Почему это происходит?
Также - если это имеет значение - ошибка не возникает, если я прокомментирую строку AddItem в TestMethod.
Я не совсем понимаю, почему эта проблема вызвана. Вы говорите, что создание 2-х эквивалентных экземпляров dbcontext вызывает проблему. что в приложении может существовать только один dbcontext для конкретного db? –
Эран Отзап, я знаю, что это поздно, но, столкнувшись с этим вопросом сегодня, я подумал, что было бы полезно опубликовать ответ, объясняющий коренные причины. Надеюсь, поможет. –