实体框架4的内存数据库

时间:2010-11-16 21:35:00

标签: .net-4.0 entity-framework-4 in-memory-database

有没有人知道一个适用于.NET 4 / EF 4的良好内存数据库?具体来说,我正在考虑单元测试,这样每个设置都可以轻松创建数据库,并使用默认值填充它,每次拆解都可以快速破坏它。

我听说SQLite doesn't support .NET 4还有其他人在使用它作为SQLServer的替代品时遇到了麻烦(这是应用程序将在发布模式下运行的。)

过去,我使用过DevExpress XPO ORM,它有一个内置的内存数据库,可以很好地进行单元测试。

3 个答案:

答案 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。

相关问题