实体框架4的内存数据库

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-实体框架/


Ste*_*tti 2

SQL CE 将为您完成此操作。它是一个在进程中运行的嵌入式数据库。它适用于 EF4(包括 Code First)。获取它的最简单方法是直接安装 NuGet 包。有两个 NuGet 包 - 一个仅具有 SQL CE,另一个具有与 EF Code First CTP4 配合使用的 SQL CE。