.net 4.0 - tutorial - DB en memoria para Entity Framework 4
mvc entity framework español (3)
SQL CE hará esto por usted. Es una base de datos integrada que se ejecuta en el proceso. Funciona con EF4 (incluido el Código Primero). La forma más fácil de obtenerlo es instalar directamente el paquete NuGet para él. Hay dos paquetes de NuGet: uno que solo tiene SQL CE y el otro que tiene el SQL CE que funciona con EF Code First CTP4.
¿Alguien sabe de un buen DB en memoria que funcione bien con .NET 4 / EF 4? Específicamente, estoy pensando en pruebas de unidad, de modo que cada configuración pueda crear fácilmente la base de datos y rellenarla con los valores predeterminados, y cada desmontaje puede destruirla, de manera rápida.
He oído que SQLite no es compatible con .NET 4 todavía, y otros han tenido problemas para usarlo como un sustituto de SQLServer (que es en lo que se ejecutará la aplicación en modo de lanzamiento).
En el pasado, usé DevExpress XPO ORM y tenía una base de datos integrada en la memoria que funcionaba bastante bien para la prueba de unidades.
Si no es un problema para ti cambiar a EF CTP4, entonces es así:
EF4 CTP4 SQL CE 4 CTP
Generará db en memoria para usted a medida que escribe pruebas de unidad (primero el código).
Tendrá un problema en la prueba de unidad con CE4 si su modelo tiene claves generadas en la base de datos (generalmente especificadas en EF4 usando la anotación [DatabaseGenerated (DatabaseGeneratedOption.Identity)]), ya que CE4 no lo admite.
Pero encontré una solución sencilla sin necesidad de modificar mi código de producción (que se ejecuta en SQL 2008). Creé una subclase proxy de mi DbContext, y en ella OnModelCreating
para eliminar la anotación, y SaveChanges
para establecer la ID manualmente:
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();
}
}
Con estos pequeños ajustes, ahora puedo probar el mismo código de repositorio en CE4 que se ejecuta en SQL 2008 en producción.
Y si está utilizando ID enteros en lugar de GUID, aquí hay un buen método de extensión que puede conectarse directamente a la solución anterior: http://enigmadomain.wordpress.com/2010/01/06/sql-compact-identity-columns-and-entity-framework/