2010-11-16 25 views
19

Quelqu'un connaît-il un bon DB en mémoire qui fonctionne bien avec .NET 4/EF 4? Plus précisément, je pense aux tests unitaires, de sorte que chaque configuration peut facilement créer la base de données et la peupler avec des valeurs par défaut, et chaque démontage peut la détruire - rapidement.DB en mémoire pour Entity Framework 4

J'ai entendu dire que SQLite doesn't support .NET 4 encore, et d'autres ont eu du mal à l'utiliser comme un substitut pour SQLServer (qui est ce que l'application s'exécutera en mode de libération). Par le passé, j'ai utilisé DevExpress XPO ORM et il y avait une base de données intégrée en mémoire qui fonctionnait très bien pour les tests unitaires.

+1

double possible de [Test EF application SQL Server avec SQLite en mémoire ?] (http://stackoverflow.com/questions/2372030/testing-ef-sql-server-based-application-with-in-memory-sqlite) –

+1

@Craig Stuntz - Je ne cherche pas à me moquer de mes dépôts, que je peux faire maintenant sans problème, je cherche à substituer un DB en mémoire pour un vrai ... de sorte que je peux non seulement tester les services mais je peux tester le code qui génère les tables de DB et insère le défaut les données dans la base de données. –

+1

Pour les personnes qui lisent cette question, SQLite prend désormais en charge .NET 4 et .NET 4.5 via ce site Web: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki –

Répondre

2

SQL CE le fera pour vous. C'est une base de données intégrée qui s'exécute en cours. Cela fonctionne avec EF4 (y compris le code d'abord). Le moyen le plus simple de l'obtenir est d'installer directement le paquet NuGet pour cela. Il y a deux paquets NuGet - un qui a seulement SQL CE et l'autre qui a le SQL CE qui fonctionne avec l'EF Code First CTP4.

+1

SQL CE ne peut pas travailler en mémoire, cependant, peut-il? – Gabe

+0

Oui, c'est le cas. Jetez un oeil à ce post par Scott Gu: http://weblogs.asp.net/scottgu/archive/2010/06/30/new-embedded-database-support-with-asp-net.aspx. La clé de cette publication est la suivante: "Le moteur de base de données SQL CE s'exécute ensuite en mémoire dans votre application.Lorsque votre application s'arrête, la base de données est automatiquement déchargée." –

+0

Pas tout à fait vrai, j'ai testé hébergé un db CE sur un disque RAM, et il y avait environ 50% d'amélioration de la vitesse de requête. CE a toujours tendance à frapper le système de fichiers plus qu'il ne le devrait (et ce que j'attends). – leppie

1

Si ce n'est pas un problème pour vous de passer à EF CTP4 alors il est comme ça:

EF4 CTP4 SQL CE 4 CTP

Il génère db en mémoire pour vous que vous écrivez des tests unitaires (code-first).

7

Vous rencontrerez un problème de test unitaire avec CE4 si votre modèle possède des clés générées par la base de données (généralement spécifiées dans EF4 avec l'annotation [DatabaseGenerated (DatabaseGeneratedOption.Identity)], car CE4 ne le prend pas en charge.

Mais j'ai trouvé une solution de contournement facile sans avoir besoin de modifier mon code de production (qui s'exécute sur SQL 2008). J'ai créé une sous-classe proxy de mon DbContext, et il l'emportaient sur OnModelCreating pour supprimer l'annotation et l'emportaient sur SaveChanges pour définir l'ID manuellement:

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

Avec ces modifications mineures, je peux maintenant test unitaire le même référentiel code dans CE4 qui s'exécute sous SQL 2008 en production.

Et si vous utilisez ID d'entiers plutôt que GUIDs, il y a une belle méthode d'extension ici qui peut être branché directement dans la solution ci-dessus: http://enigmadomain.wordpress.com/2010/01/06/sql-compact-identity-columns-and-entity-framework/