БД в памяти для Entity Framework 4
Кто-нибудь знает хорошую БД в памяти, которая хорошо работает с.NET 4/EF 4? В частности, я имею в виду модульное тестирование, так что каждая установка может легко создать БД и заполнить ее значениями по умолчанию, а каждая разборка может быстро ее уничтожить.
Я слышал, что SQLite пока не поддерживает.NET 4, и у других возникли проблемы с его использованием в качестве замены SQLServer (именно это приложение будет запускать в режиме выпуска).
В прошлом я использовал DevExpress XPO ORM, и у него была встроенная база данных в памяти, которая довольно хорошо работала для модульного тестирования.
3 ответа
У вас будет проблемное модульное тестирование с CE4, если ваша модель имеет сгенерированные базой данных ключи (обычно указанные в EF4 с помощью аннотации [DatabaseGenerated(DatabaseGeneratedOption.Identity)]), поскольку CE4 не поддерживает это.
Но я нашел легкий обходной путь без необходимости изменять мой рабочий код (который работает на SQL 2008). Я создал прокси подкласс моего DbContext, и в нем переопределено OnModelCreating
удалить аннотацию и переопределить SaveChanges
установить идентификатор вручную:
public class TestContext : MyDbContext
{
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>().Property(e => e.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
base.OnModelCreating(modelBuilder);
}
public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries<MyEntity>().Where(e => e.State == EntityState.Added))
{
entry.Entity.Id = Guid.NewGuid();
}
return base.SaveChanges();
}
}
Благодаря этим небольшим изменениям я теперь могу тестировать тот же код репозитория в CE4, который работает в SQL 2008 в производстве.
И если вы используете целочисленные идентификаторы, а не GUID, здесь есть хороший метод расширения, который можно подключить прямо к вышеуказанному решению: http://enigmadomain.wordpress.com/2010/01/06/sql-compact-identity-columns-and-entity-framework/
SQL CE сделает это за вас. Это встроенная база данных, которая работает в процессе. Работает с EF4 (включая Code First). Самый простой способ получить его - это напрямую установить для него пакет NuGet. Существует два пакета NuGet - один с SQL CE, а другой с SQL CE, который работает с EF Code First CTP4.
Если вам не сложно переключиться на EF CTP4, тогда это так:
EF4 CTP4 SQL CE 4 CTP
Он будет генерировать дБ в памяти для вас, когда вы пишете модульные тесты (сначала код).