public class EFTransaction:ITransaction
{
DbContextTransaction originalTransaction = null; MyDbContext myDbContext = null; /// <summary>
/// 默认构造函数
/// </summary>
public EFTransaction()
{
myDbContext= DbContextHelper.MainDbContextFactory.GetDbContext(AccessMode.Write);
originalTransaction = myDbContext.Database.CurrentTransaction;
} /// <summary>
/// 构造函数
/// </summary>
public EFTransaction(IDbContextFactory factory)
{
myDbContext= factory.GetDbContext(AccessMode.Write);
originalTransaction = myDbContext.Database.CurrentTransaction;
} /// <summary>
/// 开始事务
/// </summary>
public void BeginTransaction()
{
MyDbContext dbContext = myDbContext;
if (originalTransaction == null)
{
dbContext.Database.BeginTransaction();
}
ThreadTransaction.SetTransactionFlag(true); } /// <summary>
/// 提交一个事务
/// </summary>
/// <returns></returns>
public int Commit()
{
int result = ;
if (originalTransaction == null)
{
result += myDbContext.SaveChanges();
ThreadTransaction.SetTransactionFlag(false);
DbContextTransaction transaction = myDbContext.Database.CurrentTransaction;
if (transaction != null)
{
transaction.Commit();
transaction.Dispose();
result += ;
} }
return result;
} /// <summary>
/// 回滚一个事务
/// </summary>
public void Rollback()
{ if (originalTransaction == null)
{
ThreadTransaction.SetTransactionFlag(false);
DbContextTransaction transaction = myDbContext.Database.CurrentTransaction;
if (transaction != null)
{
transaction.Rollback();
transaction.Dispose();
}
}
else
{
throw new Exception("嵌套内部事务异常");
}
} }

支持嵌套事务

使用示例:

  public static TResult AddTest0()
{ BookDAL testdal = DALFactory.CreateDAL<BookDAL>();
Framework.DataAccess.EFTransaction Transaction = new Framework.DataAccess.EFTransaction();
Transaction.BeginTransaction();
try
{
testdal.Insert(new Book { NAME="c#1234" });
Transaction.Commit();
}
catch (Exception ex)
{
Transaction.Rollback();
}
var ss= testdal.GetList();
return null;
}

EF事务封装的更多相关文章

  1. EF 事务

    http://yanwushu.byethost7.com/?p=87 1. EF对事务进行了封装:context的saveChange()是有事务性的. 2. 依赖多个不同的Context的操作(即 ...

  2. EF事务处理封装公用

    /// <summary> /// EF事务封装 公用类 /// </summary> public class TransactionCommon { DbContextTr ...

  3. 分享我们项目中基于EF事务机制的架构

    写在前面: 1. 本文中单元测试用到的数据库,在执行测试之前,会被清空,即使用空数据库. 2. 本文中的单元测试都是正确通过的. 要理解EF的事务机制,首先要理解这2个类:TransactionSco ...

  4. 分享我们项目中基于EF事务机制的架构 【转载】

    http://www.cnblogs.com/leotsai/p/how-to-use-entity-framework-transaction-scope.html 写在前面: 1. 本文中单元测试 ...

  5. OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

    公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...

  6. 把事务封装成类似Serializable用法的特性

    把事务封装成类似Serializable用法的特性 最近几天上班没事可做就想着整理常用的类库方法,验证.消息.分页.模版引擎.数据库操作.ini操作.文本操作.xml操作等,最后就是现在这个事务特性. ...

  7. EF事务嵌套

    EF中采用的是数据上下文DbContext,当针对数据库的所有操作共用一个数据上下文的时候,会使用同一个连接对象,因此连接打开一次,最后Save的时候关闭连接,避免了频繁的创建连接对象打开关闭,这在一 ...

  8. MVC,EF 小小封装

    1.项目中经常要用到 EF,有时候大多数的增删改查都是重复性的东西,本次封装就是为了快速开发,期间没有考虑到架构上的各种思想,就感觉到欠缺点什么东西所以这次将这些拉出来,有存在问题的话还请各位多多指导 ...

  9. EF 事务(转载)

    事务简单用法 文章一:https://www.cnblogs.com/wujingtao/p/5407821.html 1EF事务 事务就是确保一次数据库操作,所有步骤都成功,如果哪一步出错了,整个操 ...

随机推荐

  1. 新东方雅思词汇---7.1、probation

    新东方雅思词汇---7.1.probation 一.总结 一句话总结:prob(检查,试验)+ation 英 [prə'beɪʃ(ə)n]  美 [pro'beʃən]  n. 试用:缓刑:查验 短语 ...

  2. SSIS的控制流之Foreach循环容器和序列容器

    上一篇介绍了For循环容器的使用.本篇将介绍Foreach循环容器和序列容器的使用. Foreach循环容器 Foreach循环容器定义包中的控制流.其循环的实现类似于编程语言中的Foreach循环结 ...

  3. 论文笔记 — MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching

    论文:https://github.com/ei1994/my_reference_library/tree/master/papers 本文的贡献点如下: 1. 提出了一个新的利用深度网络架构基于p ...

  4. 解决:Python爬取https站点时SNIMissingWarning和InsecurePlatformWarning

    今天想利用Requests库爬取糗事百科站点,写了一个请求,却报错了: 后来参考kinsomy的博客,在cmd中pip install pyopenssl ndg-httpsclient pyasn1 ...

  5. 是因为Session只能让服务器在一次连续的会话中记住你,而Cookie是记住浏览器一段时间

    Cookie的作用 因为http协议先天不足是无记忆性. 还有一个区别是:Session是服务器端保存会话状态的机制. 而Cookie则是浏览器端保存会话的机制. Cookie 的应用

  6. 使用Visio画UML模型

    Microsoft Office Visio“UML 模型图” 模板为创建复杂软件系统的面向对象的模型 (模型:建模系统的一种抽象表示,它从特定的视角并在某一抽象级别上指定建模系统.) 提供全面的支持 ...

  7. boost开发指南

    C++确实很复杂,神一样的0x不知道能否使C++变得纯粹和干爽? boost很复杂,感觉某些地方有过度设计和太过于就事论事的嫌疑,对实际开发工作的考虑太过于理想化.学习boost本身就是一个复杂度,有 ...

  8. Debian For ARM mysql-server install information

    /**************************************************************************** * Debian For ARM mysql ...

  9. C#进阶之路(四):拉姆达

    对于拉姆达,许多文章都讲过原理及如何使用,所以这篇文章我主要是摘录我学习过的文字,总结下我自己的学习心得. 什么是拉姆达表达式 "Lambda表达式"是一个匿名函数,是一种高效的类 ...

  10. Hat’s Words(字典树的运用)

    个人心得:通过这道题,对于树的运用又加深了一点,字典树有着他独特的特点,那个指针的一直转换着实让我好生想半天, 不得不佩服这些发明算法人的大脑. 这题的解决方法还是从网上找到的,还好算法是自己实现得, ...