Подтвердить что ты не робот

Внутренняя память для Entity Framework 4

Кто-нибудь знает хорошую базу данных в памяти, которая хорошо работает с .NET 4/EF 4? В частности, я думаю о модульном тестировании, так что каждая установка может легко создавать БД и заполнять ее значениями по умолчанию, и каждое разрывы могут уничтожить ее - быстро.

Я слышал, что SQLite пока не поддерживает .NET 4, а другим не удалось использовать его в качестве замены SQLServer ( это то, что приложение будет работать в режиме деблокирования).

В прошлом я использовал DevExpress XPO ORM, и у него была встроенная база данных в памяти, которая хорошо работала для модульного тестирования.

4b9b3361

Ответ 1

У вас будет тестовое тестирование проблемы с CE4, если у вашей модели есть сгенерированные с помощью базы данных ключи (обычно указанные в EF4 с помощью аннотации [DatabaseGenerated (DatabaseGeneratedOption.Identity)], поскольку CE4 не поддерживает это.

Но я нашел легкое обходное решение без необходимости изменять мой производственный код (который работает на SQL 2008). Я создал прокси-подкласс моего DbContext, и в нем overrode 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();
  }
}

С этими незначительными изменениями я могу теперь unit test тот же код репозитория в CE4, который работает под SQL 2008 в процессе производства.

И если вы используете идентификаторы целого числа, а не GUID, здесь есть хороший метод расширения, который можно подключить прямо к вышеупомянутому решению: http://enigmadomain.wordpress.com/2010/01/06/sql-compact-identity-columns-and-entity-framework/

Ответ 2

SQL CE сделает это за вас. Это встроенная база данных, которая выполняется в процессе. Он работает с EF4 (включая Code First). Самый простой способ получить это - прямо установить пакет NuGet для него. Существует два пакета NuGet - один из которых имеет только SQL CE, а другой - SQL CE, который работает с EF Code First CTP4.

Ответ 3

Если вам не нужно переходить на EF CTP4, то это так:

EF4 CTP4 SQL CE 4 CTP

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