Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 集成测试实体框架代码优先与内存数据库_Sqlite_Entity Framework 4.1_Ef Code First - Fatal编程技术网

Sqlite 集成测试实体框架代码优先与内存数据库

Sqlite 集成测试实体框架代码优先与内存数据库,sqlite,entity-framework-4.1,ef-code-first,Sqlite,Entity Framework 4.1,Ef Code First,我想对内存中的数据库进行EF4.1存储库的实际集成测试 我有一个基于遗留数据库的代码优先模型(旧表和列名需要使用代码配置映射到我的实体) 我希望能够使用Sqlite(或其他)来: 从我的模型生成内存中的数据库 使用此内存数据库为我的模型创建DBContext 我已经准备好IDBContextFactory的IoC/DI,它是用我的(通用)存储库构建的(也使用GenericRepository模式) 在线的bits和BOB表明这应该是可能的,但对于代码优先的方法来说并不多。有人知道这是否可能吗 我

我想对内存中的数据库进行EF4.1存储库的实际集成测试

我有一个基于遗留数据库的代码优先模型(旧表和列名需要使用代码配置映射到我的实体)

我希望能够使用Sqlite(或其他)来:

  • 从我的模型生成内存中的数据库
  • 使用此内存数据库为我的模型创建DBContext
  • 我已经准备好IDBContextFactory的IoC/DI,它是用我的(通用)存储库构建的(也使用GenericRepository模式)
  • 在线的bits和BOB表明这应该是可能的,但对于代码优先的方法来说并不多。有人知道这是否可能吗

    我的测试库的一些片段,请参见标记运行时错误时抛出错误:

    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;
          }
        }
      }
    

    [测试]
    公共无效测试_me()
    {
    var auditRespository=new AuditRepository(new MyDbContextFactory());
    auditRespository.GetAll();
    }
    
    使用SQL Compact 4.0(通过web平台安装程序下载SqlCE和工具)-EF code first直接支持这一点。唯一的区别是,您的应用程序将使用到大型SQL Server的连接字符串:

    <add name="MyDbContext" 
         provider="System.Data.SqlClient" 
         connectionString=
           "Data Source=...;InitialCatalog=...;Integrated Security=SSPI" />
    
    
    
    您的测试将使用连接字符串来压缩SQL:

    <add name="MyDbContext" 
         provider="System.Data.SqlServerCe.4.0" 
         connectionString="Data Source=Database.sdf" />
    

    看看这篇文章:。它描述了如何将实体框架隐藏在抽象后面,以便可以轻松地对应用程序进行单元测试,同时仍然允许在应用程序代码中对其使用LINQ(over
    IQueryable
    )查询


    注意,这并不能完全消除编写集成测试的需要,因为您仍然需要测试数据库映射层,可能还需要测试所选的LINQ提供程序是否能够执行LINQ查询。

    您多次首先提到代码,但同时您正在从EDMX文件(设计器)构建引用资源文件的实体连接字符串那么,您使用的是哪种方法呢?引用:“?因为没有元数据而无法工作”其代码非常棒。工作是一种享受。谢谢我仍然不考虑进行单元测试,因为每次测试后都需要进行某种清理,以保持数据库处于一致状态。@Steven:这不是单元测试。这是集成测试,根据我的经验,这是使用IQueryable和EF真正测试代码的唯一有效方法。稍后我将阅读您的链接文章。@Ladislay:当使用任何O/RM工具时,我们需要集成测试。至少我们需要确保映射层被正确定义,我们需要为此进行集成测试。我想我们在这一点上是一致的。但是对于测试业务逻辑来说,单元测试更有价值,因为它们运行得更快,更易于维护。史蒂文:我知道这个理论,我也用过它,但它不适用于在业务逻辑中定义查询。一旦我们运行了did单元测试,我们就使用linq to对象,而不是linq to实体,测试是绿色的,但很多时候,当我们使用EF provider运行相同的查询时,代码不起作用。LINQtoEntities是Linq功能的唯一子集,因此我更喜欢直接使用真实的db提供程序测试查询。
    <add name="MyDbContext" 
         provider="System.Data.SqlServerCe.4.0" 
         connectionString="Data Source=Database.sdf" />