2010-11-16 13 views
19

Czy ktoś wie o dobrej DB w pamięci, która działa dobrze z .NET 4/EF 4? Mówiąc konkretnie, myślę o testowaniu jednostkowym, tak aby każda konfiguracja mogła łatwo utworzyć bazę danych i zapełnić ją wartościami domyślnymi, a każda strata może je zniszczyć - w szybki sposób.DB-In DB dla Entity Framework 4

Słyszałem, że SQLite doesn't support .NET 4 jeszcze, i inni mieli problem z wykorzystaniem go jako substytutu SQLServer (który jest, co aplikacja będzie działać w trybie zwolnienia).

W przeszłości używałam DevExpress XPO ORM i miałam wbudowaną bazę danych w pamięci, która działała całkiem dobrze dla testów jednostkowych.

+1

możliwe duplikat [aplikacji opartej Testowanie EF SQL Server z in-memory SQLite ?] (http://stackoverflow.com/questions/2372030/testing-ef-sql-server-application-with-in-memory-sqlite) –

+1

@Craig Stuntz - Nie chcę kpić z moich repozytoriów, że mogę zrobić teraz bez problemów, szukam zastępowania DB w pamięci dla rzeczywistego ... tak, że mogę nie tylko przetestować usługi, ale mogę przetestować kod, który generuje tabele DB i wstawi domyślną dane do bazy danych. –

+1

Ludziom, którzy czytają to pytanie, SQLite obsługuje teraz .NET 4 i .NET 4.5 za pośrednictwem tej witryny: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki –

Odpowiedz

2

SQL CE zrobi to za Ciebie. Jest to wbudowana baza danych, która działa w procesie. Działa z EF4 (w tym Code First). Najprostszym sposobem na to jest zainstalowanie pakietu NuGet. Istnieją dwa pakiety NuGet - jeden, który ma SQL CE, a drugi SQL CE, który działa z kodem EF First CTP4.

+1

SQL CE nie może jednak działać w pamięci, prawda? – Gabe

+0

Tak, robi. Popatrz na ten post Scotta Gu: http://weblogs.asp.net/scottgu/archive/2010/06/30/new-embedded-database-support-with-asp-net.aspx. Klucz z tego wpisu jest następujący: "Silnik bazy danych SQL CE uruchamia się w pamięci w aplikacji. Po zamknięciu aplikacji baza danych jest automatycznie rozładowywana." –

+0

Nie do końca prawda, przetestowałem hostowaną wersję CE db na dysku RAM, a prędkość zapytań wzrosła o około 50%. CE wciąż ma tendencję do uderzania w system plików trudniej niż powinien (i czego się spodziewam). – leppie

1

Jeśli to nie problem, aby przełączyć się na EF CTP4 potem to tak:

EF4 CTP4 SQL CE 4 CTP

To wygeneruje db w pamięci dla Ciebie, jak pisać testy jednostkowe (najpierw kod).

7

Będziesz miał problem z testowaniem jednostkowym z CE4, jeśli twój model ma klucze generowane przez bazę danych (zwykle określane w EF4 przy użyciu adnotacji [DatabaseGenerated (DatabaseGeneratedOption.Identity)], ponieważ CE4 tego nie obsługuje.

Ale znalazłem łatwe obejście bez konieczności modyfikacji mojego kodu produkcyjnego (który działa na SQL 2008). I stworzył proxy podklasę moim DbContext, aw nim overrode OnModelCreating usunąć adnotację, i overrode SaveChanges ustawić identyfikator ręcznie:

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(); 
    } 
} 

Z tych drobnych poprawek, mogę teraz testy jednostkowe tym samym repozytorium kod w CE4, który działa w SQL 2008 w produkcji.

A jeśli używasz identyfikatorów całkowitych zamiast GUID, jest to miły sposób tutaj rozszerzenie, które można podłączyć prosto do powyższego roztworu: http://enigmadomain.wordpress.com/2010/01/06/sql-compact-identity-columns-and-entity-framework/

Powiązane problemy