事物的概念由来已久,简而言之就是"全做或不做"。在EntityFramework中,事物也有很好的支持。通过指定事物的影响的范围,在合适的时间开启和提交事物,我们就能够很好地使用事物完成CRUD操作,确保数据一致性。
1.Customer类
namespace EntityFrameworkTransaction
{
class Customer
{
public int Id { set; get; }
public string Username { set; get; }
public string Password { set; get; }
}
}
2.ApplicationDbContext
namespace EntityFrameworkTransaction
{
class ApplicationDbContext:DbContext
{
public ApplicationDbContext()
:base("name=ModelsContainer")
{
}
public DbSet<Customer> Customers { set; get; }
}
}
3.App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<connectionStrings>
<add name="ModelsContainer"
connectionString="Server=localhost;Database=MyWSCLM;User ID=sa; Password=1234;"
providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
4.Test
namespace EntityFrameworkTransaction
{
class Program
{
static void Main(string[] args)
{
using (var ctx = new ApplicationDbContext())
{
using (var ctxTransaction = ctx.Database.BeginTransaction())
{
try
{
ctx.Database.Log = Console.WriteLine;
ctx.Customers.Add(new Customer()
{
Username = "justin",
Password = "123456"
});
ctx.Database.ExecuteSqlCommand("update Customerss set password ='xpy092929'");
var list = ctx.Customers.Where(x => x.Id > 0).ToList();
list.ForEach(x =>
{
x.Username = "user002";
});
ctx.SaveChanges();
ctxTransaction.Commit();
}
catch (Exception)
{
ctxTransaction.Rollback();
}
}
}
Console.ReadKey();
}
}
}
5.结果
1)正常提交
2)异常回滚
6.推荐阅读
1)EF事务,异步及性能优化
http://www.cnblogs.com/CreateMyself/p/4787856.html#commentform
2)EF中事务处理
http://blog.sina.com.cn/s/blog_537c4fd3010123jb.html
3)EF批量提交和事务
http://www.cnblogs.com/hyl8218/archive/2011/10/10/2205576.html