Ste*_*ers 20 .net-4.0 in-memory-database entity-framework-4
有没有人知道一个适用于.NET 4/EF 4的良好内存数据库?具体来说,我正在考虑单元测试,这样每个设置都可以轻松创建数据库,并使用默认值填充它,每次拆卸都可以快速破坏它.
我听说SQLite 还不支持.NET 4,其他人在使用它作为SQLServer的替代品时遇到了麻烦(这是应用程序将在发布模式下运行的).
在过去,我使用了DevExpress XPO ORM,它有一个内置的内存数据库,可以很好地进行单元测试.
小智 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();
}
}
Run Code Online (Sandbox Code Playgroud)
通过这些小调整,我现在可以在生产中在SQL 2008下运行的CE4中对相同的存储库代码进行单元测试.
如果您使用的是整数ID而不是GUID,那么这里有一个很好的扩展方法,可以直接插入到上面的解决方案中:http://enigmadomain.wordpress.com/2010/01/06/sql-compact-identity-columns -and-实体框架/
SQL CE 将为您完成此操作。它是一个在进程中运行的嵌入式数据库。它适用于 EF4(包括 Code First)。获取它的最简单方法是直接安装 NuGet 包。有两个 NuGet 包 - 一个仅具有 SQL CE,另一个具有与 EF Code First CTP4 配合使用的 SQL CE。
归档时间: |
|
查看次数: |
5802 次 |
最近记录: |