有没有人知道一个适用于.NET 4 / EF 4的良好内存数据库?具体来说,我正在考虑单元测试,这样每个设置都可以轻松创建数据库,并使用默认值填充它,每次拆解都可以快速破坏它。
我听说SQLite doesn't support .NET 4还有其他人在使用它作为SQLServer的替代品时遇到了麻烦(这是应用程序将在发布模式下运行的。)
过去,我使用过DevExpress XPO ORM,它有一个内置的内存数据库,可以很好地进行单元测试。
答案 0 :(得分:8)
如果您的模型具有数据库生成的密钥(通常使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]注释在EF4中指定),那么使用CE4进行单元测试时会遇到问题,因为CE4不支持此功能。
但我找到了一个简单的解决方法,无需修改我的生产代码(在SQL 2008上运行)。我创建了我的DbContext的代理子类,并在其中覆盖OnModelCreating
以删除注释,并覆盖SaveChanges
以手动设置ID:
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();
}
}
通过这些小调整,我现在可以在生产中在SQL 2008下运行的CE4中对相同的存储库代码进行单元测试。
如果您使用的是整数ID而不是GUID,那么这里有一个很好的扩展方法,可以直接插入到上面的解决方案中:http://enigmadomain.wordpress.com/2010/01/06/sql-compact-identity-columns-and-entity-framework/
答案 1 :(得分:2)
SQL CE将为您完成此操作。它是一个在进程中运行的嵌入式数据库。它适用于EF4(包括Code First)。最简单的方法是直接安装NuGet包。有两个NuGet包 - 一个只有SQL CE,另一个有SQL CE,可以使用EF Code First CTP4。
答案 2 :(得分:1)
如果切换到EF CTP4不是问题,那就是:
EF4 CTP4 SQL CE 4 CTP
在编写单元测试(代码优先)时,它将为您生成内存中的db。