EDITEDDatabase Initialization Запуск слишком поздно
Я бегу модульного тестирования (с использованием NUnit) для метода инициализации databsae. Я создал тест и заполнение базы данных с помощью тестового примера с помощью этого:
[TestFixtureSetUp]
public void SetUp()
{
//select database
Database.DefaultConnectionFactory = new SqlConnectionFactory(connectionString);
database = new POSDatabaseContext(connectionString);
//drop database and recreate
string query = "ALTER DATABASE [POS] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;";
database.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, query);
database.Database.Delete();
database.Database.Create();
//add seed value to test against
database.Metadata.Add(new Metadata {
ID = "META",
IsInitialized = false,
testBool = true,
TimeCreated = DateTime.Now,
TimeEdited = DateTime.Now
});
database.SaveChanges();
}
Я затем запустить тестовый метод, который заключается в следующем:
[Test]
public void InitializeDatabaseTestWithMatchingModel()
{
//set initializer for data context to test it, and run it
Database.SetInitializer<POSDatabaseContext>(new
CustomDropCreateDatabaseWithMatchingModelTest());
database.Database.Initialize(true);
//use the metadata table to check if it was run correctly
//if metadata exist, which it should
if(database.Metadata.Any(s => s.ID == "META"))
{
Metadata actual = database.Metadata.Single(s => s.ID == "META");
Assert.IsTrue(actual.IsInitialized);
}
else
throw new Exception("The Database was not seeded correctly for the test");
}
Для того, чтобы проверить мои пользовательские Initializer я сделал класс, который наследует от него, я мог бы использовать метод Seed(), чтобы сделать некоторые данные, которые я мог бы проверить. Этот класс:
А класс он был получен от:
//This file contains custom versions of the built in
//database intializer classes in which an SQL Statement
//is run to stop all connections to the database so that
//when the database is dropped, a database in use
//exception is not thrown.
public class CustomDropCreateDatabaseIfModelChanges<Context>
: IDatabaseInitializer<Context> where Context : DbContext
{
public void InitializeDatabase(Context context)
{
if (context.Database.Exists())
{
if (!context.Database.CompatibleWithModel(true))
{
string query = "ALTER DATABASE [POS] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;";
context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, query);
context.Database.Delete();
context.Database.Create();
}
//else do nothing and continue
}
else context.Database.Create();
//run seed method
Seed(context);
}
//OVERIDE ME
//this method seeds the database with data
protected virtual void Seed(Context context) { }
}
Проблема я, кажется, имея в том, что Initilization не не работает до тех пор, после утверждают. Я проверил значения метаданных, а значения - значения метода SetUp(). Я также проверил, что объект помечен как измененный, прежде чем SaveChanges() вызывается в методе, который я тестирую. Однако этот метод, безусловно, работает, потому что база данных отражает значения из метода.
Первоначальная проблема, с которой я думал, заключалась в том, что свойство IsInitialized возвращалось как неправильное значение, так как оно было 1 в базе данных, но я получал false в коде.
Вы пытались установить еще одно свойство boolean? Это может привести к пониманию, если вы пропустили что-нибудь в первый раз. – Archangel33
Я думал об этом, но я не уверен, как я буду использовать его. Это сложно, потому что я бы хотел, чтобы его использовали по-другому, чтобы проверить его. Я думаю. – some1one
Извините, отредактированный, я пропустил это при публикации кода. Строка в моем коде одинакова. – some1one