БД в памяти для 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

Он будет генерировать дБ в памяти для вас, когда вы пишете модульные тесты (сначала код).

Другие вопросы по тегам