EF4 Code First、TDD、CRUD 和事务

2024-02-02

过去,我在创建数据访问/存储库代码时为简单的 CRUD 操作编写了单元测试,如下所示:

using(var connection = new WhateverConnection(connectionString))
{
    connection.Open();
    using(var transaction = connection.BeginTransaction())
    {
        try
        {
            //test the CRUD operation
        }
        finally
        {
            //gets rid of any stuff created during the test
            transaction.Rollback();
        }
    }
}

今天我在摆弄 EF4 Code First,我意识到我不知道这个测试场景如何在实体框架词典中转换。看来,如果我打电话DbContext.SaveChanges(),它节省了and承诺,无论是否AcceptAllChanges()被称为。即使使用ObjectContext代替DbContext,我无法弄清楚如何在不手动清理创建的任何模拟/测试对象的情况下重新创建这个简单的测试场景。我确实读过MSDN 上的这篇文章 http://msdn.microsoft.com/en-us/library/bb738523.aspx, but TransactionScope确实没有Rollback键入方法。我用吗TransactionScope并且从不打电话Complete?是否有另一种方法或方式使用 DbContext 和/或 ObjectContext 以便在单元测试期间回滚?我是否需要通过 EF4 Code First 彻底重新调整 TDD 思维?


ObjectContext本身不暴露事务行为。您必须自己将 EF 代码包装在事务中。最简单的方法是使用TransactionScope。如果你不打电话Complete作用域上的方法并处置它,它将执行回滚。我们通常使用基类进行此类集成测试:

[TestClass]
public abstract class TransactionTestBase
{
    private TransactionScope scope = null;

    [TestInitialize]
    public virtual void TestInitialize()
    {
      scope = new TransactionScope(TransactionScopeOption.RequiresNew,
          new TransactionOptions()
              {
                  IsolationLevel = IsolationLevel.ReadUncommitted
              });
    }

    [TestCleanup]
    public virtual void TestCleanup()
    {
        if (scope != null)
        {
            scope.Dispose();
            scope = null;
        }
    }
}

所有测试类都派生于该类。TestInitialize在每个之前调用TestMethod在派生类中和TestCleanup在每个之后调用TestMethod所以你的测试根本不需要处理事务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF4 Code First、TDD、CRUD 和事务 的相关文章

  • SQL Server、C#:事务回滚超时异常

    我有一个奇怪的问题 我有一个 NET 程序 我的处理逻辑需要在 SQL Server 2005 数据库上进行长时间运行的事务 约 20 分钟 没关系 因为没有人并行访问数据库 当出现问题时 事务应该回滚 很少发生并且没有任何可见的模式 th
  • Capybara+Selenium:如何在集成测试代码中初始化数据库并使其在 Rails 应用程序中可见?

    配置 使用 RSpec Capybara Selemium 驱动程序 SQLite 数据库对 Rails 项目进行集成测试 情况 我与 Capybara 和默认的rack test 驱动程序进行了一些集成测试 他们直接在数据库中创建用户注册
  • TDD中如何处理接口过度使用?

    我注意到 当我进行 TDD 时 它通常会导致大量的接口 对于具有依赖项的类 它们以通常的方式通过构造函数注入 public class SomeClass public SomeClass IDependencyA first IDepen
  • .Net Framework 4.5 AddObject() 不出现

    我有一个我想要上的课Insert Update Delete其中的操作 Constructor public BaseManager Disable lazy loading this Context Configuration LazyL
  • MSTest:如何增加测试时间

    我有一个测试需要运行超过 1 分钟 VS2008 MSTest 测试是从 VisualStudio 启动的 const int TestTimeout 1 TestMethod Timeout 10 60 1000 10 minutes p
  • 使用模型优先方法时如何播种数据?

    所以我正在学习MVC3和EF4 我尝试了代码优先方法 但它对我来说太混乱了 我可以毫无问题地创建类 但最困难的部分是处理外键和彼此之间的关系 但我首先选择了模型 这样我就可以直观地设计它并查看关系在哪里 创建模型后 它会为我创建一个 SQL
  • 在 Grails 下如何防止异常导致事务回滚?

    我的 Grails 服务遇到一个问题 即与事务无关的吞没异常会导致事务回滚 即使它与域对象的持久性无关 在我的服务中 我有一些类似的东西 updateSomething domainObj def oldFilename domainObj
  • TransactionScope 超时过早发生?

    我在用着TransactionScope进行一些批量插入和更新 问题是 即使我设置了超时 我也会在 30 分钟长的操作中遇到超时异常TransactionScope到一小时 此外 在异常之后 它会插入看似随机数量的批次记录 例如 最后一个操
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • Node.js 和代码优先

    我使用代码优先方法开发实体框架 现在我正在学习 Node js 我想知道是否有一种方法可以使用 Node js 和一些库来实现相同的代码优先方法 我正在考虑使用MySql作为数据库 你可以看看续集 http docs sequelizejs
  • @Transactional 注解属于哪里?

    如果您将 Transactional in the DAO类和 或其方法 或者注释使用 DAO 对象调用的服务类是否更好 或者注释两个 层 是否有意义 我认为事务属于服务层 它是了解工作单元和用例的人 如果您将多个 DAO 注入到需要在单个
  • 使用@Transactional注解批量插入

    在我的 Spring 应用程序中 我想一次性在数据库中插入近 1500 条记录 我在后端使用 Spring 4 X 和普通休眠 在我的服务层中 我使用 Transactional 注释 现在 在某个时间点之后插入记录时 我遇到内存不足错误
  • 使用 EF CPT5 进行域建模和映射

    我正在尝试制作一个包含照片集的相册的模型 每个相册都会有一组照片和一张拇指照片 这是我拥有的 但 EF 似乎不喜欢它 我正在使用 EF CPT5 该模型 public class Album IEntity private DateTime
  • SQL Server 中的嵌套事务

    sql server 允许嵌套事务吗 如果是的话那么交易的优先级是什么 来自 SQL Server 上的 MSDN 文档 嵌套交易 http msdn microsoft com en us library ms189336 SQL 90
  • 为什么我收到错误“无法设置类型 Y 上的属性 X,因为集合已设置为 EntityCollection”?

    当我尝试将一个集合映射到 EF4 中的另一个集合时 出现此错误 无法设置类型 Resource EF810770B4FCA2E071F38C2F2EE328AAC216CA2A7BF157503E6658A42D7CF53A 的属性 Res
  • 无法在 Zend Framework 中回滚事务

    我在 Zend Framework 中使用以下代码进行事务 但回滚功能不起作用 数据通过 insertSome data 插入数据库 怎么了 db gt beginTransaction try model gt insertSome da
  • 将对象列表添加到 ef 中的上下文

    是否可以在不使用 foreach addObject 的情况下将对象列表添加到实体框架中的 Context 感谢帮助 从 EntityFramework 6 开始 您可以使用DbSet AddRange 方法 IEnumerable htt
  • 使用外键引用创建新的 EF 对象,而不加载整个重新引用对象

    我想创建一个新的 EF 对象 它引用另一个对象 我的示例中的 aspnet userId 而不加载外部 键 对象 所以本质上我想做以下事情 buskerSet bs new buskerSet bs Title title bs Image
  • 使用@Transactional(readOnly = true) 有什么优点?

    我是初学者 据我了解 Transactional只需确保类或方法的所有内部工作都用注释 Transactional将被包装在一个事务中 并且来自外部源的所有调用都将创建一个新事务 但是为什么我们实际上需要在下面的存储库中使用这些注释以及使用
  • 实体框架代码优先 - 在另一个文件中配置

    使用 Fluent API 将表到实体的映射分开的最佳方法是什么 以便它全部位于单独的类中 而不是内联在 OnModelCreating 方法中 我目前在做什么 public class FooContext DbContext prote

随机推荐

  • java中线程占用多少内存[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Perl 中,如何使用 SSH 密钥而不是密码通过 FTP 传输文件?

    我的本地系统和远程服务器配置了 ssh 密钥交换 我想使用 NET FTP 包从远程系统获取 XML 文件 您能建议一种使用 Net FTP 包进行文件传输但无需密码的方法吗 我想你正在寻找网络 SFTP http search cpan
  • 如何将日期 dd / mm / yyyy 转换为 yyyy-MM-dd HH:mm:ss Android [重复]

    这个问题在这里已经有答案了 如何将 dd mm yyyy 中的日期转换为支持 sqlite yyyy MM dd T HH mm ss 的格式 例如 public static String convertStringToData Stri
  • 为什么在将 next.js 与环境变量一起使用时我的 API 密钥可见?

    我遵循 next js 文档并在 now 服务器上添加了自定义 api 密钥 问题是当我跑步时now dev然后转到 源 选项卡 我可以在那里看到我的 api 密钥 api 密钥保存在 env build文件 这是我的代码 index js
  • 在mysql中查找数据库中具有最大行数的表

    正如问题标题所示 我想找到特定数据库中具有最大行数 条目 的表 我已经能够使用下面的查询提取特定数据库中所有表的名称 SELECT TABLE NAME FROM information schema tables WHERE TABLE
  • 如何用resteasy开发认证?

    我正在制作小型网络服务 1 我决定使用resteasy 来制作它 但我需要知道使用 Resteasy 开发身份验证的最佳实践是什么 Web 服务应该发送什么样的响应 响应通常是 XML 还是什么格式 XML 响应应该是什么格式 顺便提一句
  • 使用 ggplot2 绘制多元高斯轮廓

    我正在尝试使用已知均值和协方差的二维高斯分布的轮廓来增强绘图 理想情况下 我只需要指定函数 它将以 2D 形式绘制 例如stat function二维除外 我可以用geom raster通过生成概率网格 我可以用吗geom contour2
  • “嵌套 foreach”与“lambda/linq 查询”性能(LINQ 到对象)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 从性能角度来看 您应该使用 嵌套 foreach 或 lambda linq 查询 尽可能编写最清晰的代码 然后进行基准测试和分析以发
  • 如何在 UWP 上的 Xamarin.Forms WebView 中启用 WebGL?

    我是 Xamarin Forms 新手 尝试在 Windows 10 x64 v1803 计算机上使用 UWP 使用 WebView 但我不知道如何让它与 WebGL 一起使用 使用 WebGL 的网站要么显示一条消息 您的视频卡不支持 W
  • 是否有符合 IEEE754(r) 标准的 Java 实现?

    是否有任何完全兼容的 IEEE754r 实现可用于 Java 为 Java 选择省略的所有功能提供支持 或者更确切地说 高级语言通常喜欢省略 Traps 粘性旗帜 定向舍入模式 加长 长双 四精度 DPD 密集小数 在任何人弄错之前先澄清一
  • 将 TintColor 设置为 MKAnnotationView 图像

    我正在写一份申请iOS 7 0 我想使用的新功能是 imageWithRenderingMode 我有一个带有以下代码的地图注释 MKAnnotationView annotationView MKAnnotationView annota
  • `?` 运算符只能在返回 `Result` 或 `Option` (或实现 `std::ops::Try` 的其他类型)的函数中使用

    我正在做我的作业 其中包括与 Rust 中的数据库建立连接 我正在使用最新版本的 mysql crate mysql 18 2 0 当我打印池变量时 我的数据库连接成功 我为表学生编写了自己的代码 但收到错误 然后我粘贴文档代码 我收到以下
  • 在 html 页面上一次播放一个视频

    我有一个 html 页面 我使用了视频标签来在线播放视频 我使用了两个视频标签 但是当我播放这两个视频时 两个视频同时播放 我想要一个解决方案 如果我播放一个视频 然后单击第二个视频 那么第一个视频应该暂停 第二个视频开始播放 任何帮助 将
  • 是否可以在 El Capitan 上运行 Xcode 6.3?

    我真的很想尝试 El Capitan 但我不知道是否可以在其上运行旧的 Xcode 因为它现在对我来说至关重要 有人尝试过吗 在终端上运行此命令 Applications Xcode app Contents MacOS Xcode dev
  • Visual Studio 操作系统的条件编译

    我知道有一种方法可以有条件地编译目标框架 例如 if net461 elif 但是有没有一种方法可以针对特定操作系统进行条件编译 像目标 os MAC或目标 os win 如果有人可以指导我如何实现它的文档或教程 第2部分 另外 有没有办法
  • Spring 注释:使用 thymeleaf 对 bean 内部对象属性进行表单验证

    Thymeleaf 有没有办法验证 bean 对象属性中的属性 考虑一下我们确实有一个 Department 类 如下所示 public class Departement Id GeneratedValue strategy Genera
  • 如何获取Web应用程序服务的使用指标数据?

    我正在尝试执行 REST API 以从部署在 Azure 上的 Web 应用程序获取使用指标数据 Hi 我正在尝试执行 REST API 以从部署在 Azure 上的 Web 应用程序获取使用指标数据 https management az
  • php随机名称

    HI 为文件夹创建随机名称的最佳方法是什么 它将用于存储文档的文件夹名称 但是将创建大量文件夹 因此如果可能的话 每次都需要唯一 长度应该在 7 个字符左右 您也可以尝试 PHP 的uniqid http us php net manual
  • ASP.NET WebAPI 将 urlencoded 正文中的空字符串作为 null 传递

    我有一个简单的 ApiController public HttpResponseMessage Put int orderid FromBody Order order Do something useful with order Not
  • EF4 Code First、TDD、CRUD 和事务

    过去 我在创建数据访问 存储库代码时为简单的 CRUD 操作编写了单元测试 如下所示 using var connection new WhateverConnection connectionString connection Open