我想对内存数据库a la
ayende’s nhibernate version运行我的EF4.1存储库的实际集成测试.
我有一个代码优先模型,针对遗留数据库(旧表和列名称需要使用代码配置映射到我的entites).
我希望能够使用sqlite(或其他)来:
>从我的模型生成内存数据库
>使用此内存数据库为我的模型创建DBContext
>我已经使用了我的(通用)存储库(也使用GenericRepository模式)构建的IDBContextFactory的IoC / DI
在线有位和bobs表明它应该是可能的,但对于代码优先方法来说并不多.任何人都知道这是否可行?
我的测试库的一些片段,请参阅// THROWS ERROR标记运行时错误:
public class MyDbContextFactory : IDbContextFactory { private static object context; public object CurrentContext { get { if(context == null) { // ?? DOESN'T WORK AS THERE'S NO Meta DATA var connBuilder = new EntityConnectionStringBuilder(); connBuilder.Provider = "System.Data.sqlite"; connBuilder.Metadata = @"res://*/TestEfDb.csdl|res://*/TestEfDb.ssdl|res://*/TestEfDb.msl"; connBuilder.ProviderConnectionString = ConfigurationManager.ConnectionStrings["DataContext"].Name; var entConnection = new EntityConnection(connBuilder.ConnectionString); // THROWS ERROR: sqlite Format of the initialization string does not // conform to specification starting at index 0 // for connection string "Data Source=:memory:;Version=3;New=True;" //var entConnection = new EntityConnection // (ConfigurationManager.ConnectionStrings["DataContext"].Name); context = new MyDbContext(entConnection); } return context; } } }
…
[Test] public void test_me() { var auditRespository = new AuditRepository(new MyDbContextFactory()); auditRespository.GetAll<Audit>(); }
解决方法
使用sql Compact 4.0(通过Web平台安装程序下载sqlCE和工具) – EF Code首先直接支持.唯一的区别是您的应用程序将使用连接字符串到大sql Server:
<add name="MyDbContext" provider="System.Data.sqlClient" connectionString= "Data Source=...;InitialCatalog=...;Integrated Security=SSPI" />
并且您的测试将使用连接字符串到sql Compact:
<add name="MyDbContext" provider="System.Data.sqlServerCe.4.0" connectionString="Data Source=Database.sdf" />