20

有谁知道与 .NET 4/EF 4 配合得很好的内存数据库?具体来说,我正在考虑单元测试,这样每个设置都可以轻松创建数据库,并使用默认值填充它,并且每次拆卸都可以快速销毁它。

我听说 SQLite还不支持 .NET 4,而其他人在使用它作为 SQLServer 的替代品时遇到了麻烦(这是应用程序将在发布模式下运行的内容)。

过去,我使用 DevExpress XPO ORM,它有一个内置的内存数据库,非常适合单元测试。

4

3 回答 3

8

如果您的模型具有数据库生成的密钥(通常在 EF4 中使用 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 注释指定),您将遇到 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();
  }
}

通过这些细微的调整,我现在可以在 CE4 中对在生产环境中在 SQL 2008 下运行的相同存储库代码进行单元测试。

如果您使用的是整数 ID 而不是 GUID,这里有一个很好的扩展方法可以直接插入到上述解决方案中: http: //enigmadomain.wordpress.com/2010/01/06/sql-compact-identity-columns -和实体框架/

于 2011-03-31T03:54:44.023 回答
2

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

于 2010-11-18T04:45:37.233 回答
1

如果切换到 EF CTP4 对您来说不是问题,那么就是这样:

EF4 CTP4 SQL CE 4 CTP

当您编写单元测试(代码优先)时,它将为您生成内存中的数据库。

于 2010-11-19T09:09:06.623 回答