我一直在研究交易似乎因为我通过他们照顾自己的EF只要false
到SaveChanges()
,然后调用AcceptAllChanges()
,如果没有错误:
SaveChanges(false);
// ...
AcceptAllChanges();
Run Code Online (Sandbox Code Playgroud)
如果事情变坏怎么办?我不必回滚,或者一旦我的方法超出范围,交易结束了吗?
在事务中途分配的任何indentiy列会发生什么?我认为如果其他人在我的事情发生之前添加了一条记录,那么这意味着会有一个缺失的身份值.
有没有理由TransactionScope
在我的代码中使用标准类?
假设我有一个查询:
begin tran
-- some other sql code
Run Code Online (Sandbox Code Playgroud)
然后我忘了提交或回滚.
如果另一个客户端尝试执行查询,会发生什么?
我正在构建我自己的自定义存储库,基于实体框架,我正在创建一些扩展方法,允许我将部分视图模型保存为实体模型,因此我正在构建自己的添加和更新方法.
目前,每个方法都有来自DbContext的SaveChanges(),在末尾调用,这意味着每个模型都会调用一个调用.
我正在为MVC4站点构建这个基本DAL模式,这意味着大多数时候我将访问1个模型,但事实并非必须如此.
在更新即3个实体时为每个模型调用SaveChanges()是不是太糟糕的做法,还是应该先将所有内容添加到对象上下文中,而不是将SaveChanges()作为某种事务提交?
实体框架6引入了一种使用BeginTransaction方法支持DbContext中的事务的新方法:
var db = new MyDbContext();
using(var tx = db.Database.BeginTransaction())
{
// update entities
try
{
db.SaveChanges();
tx.Commit();
}
catch(Exception)
{
tx.Rollback();
}
}
Run Code Online (Sandbox Code Playgroud)
是否需要在方法中调用Rollback()?如果没有在异常中调用会发生什么?我知道在使用TransactionScope时,它将在处理时自动回滚事务并且不调用Complete.DbContextTransaction的行为是否相似?
我在stackoverflow上搜索但找不到类似的问题,请指出我是否有一个问题.
我试图用同步和异步操作实现一个通用的可重用存储库,但是我对实体框架和工作单元的了解很少,我很难找到实现它的正确方法.
我在SaveAndCommit操作中添加了一些变体,但不知道使用事务和异步执行此操作的最佳方法是什么.
- - 编辑 - -
根据我的理解,当执行多个操作时应该使用事务,但出于理解目的,我将它用于一个操作.(如果我错了,请纠正我)
这就是我到目前为止所做的
public class Service<TEntity> : IService<TEntity>
where TEntity : Entity
{
#region Constructor and Properties
UnitOfWork _unitOfWork { get { return UnitOfWork.UnitOfWorkPerHttpRequest; } }
protected DbSet<TEntity> Entities
{
get { return _unitOfWork.Set<TEntity>(); }
}
#endregion Constructor and Properties
#region Operations
public virtual IQueryable<TEntity> QueryableEntities()
{
return Entities;
}
public virtual async Task<IList<TEntity>> WhereAsync(Expression<Func<TEntity, bool>> predicate)
{
return await Entities.Where(predicate).ToListAsync();
}
public virtual IList<TEntity> Where(Expression<Func<TEntity, bool>> predicate)
{
return Entities.Where(predicate).ToList();
}
public …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Entity Framework 6为我的ASP.NET MVC应用程序运行集成测试.
我得到的错误是
System.Data.Entity.Core.EntityException:基础提供程序在Rollback上失败.---> System.ArgumentNullException:Value不能为null.
参数名称:连接
代码如下所示:
Database.SetInitializer(new PrimaryInitializerTest());
_context = new PrimaryContextTest();
_context.Database.Initialize(true);
using (var dbt = _context.Database.BeginTransaction())
{
dbt.Commit();
dbt.Rollback();
}
Run Code Online (Sandbox Code Playgroud)
我也尝试dbt.UnderlyingTransaction.Connection.Open()
在using语句dbt.UnderlyingTransaction.Connection.Close()
下方进行调用,并在调用之下调用Rollback()
.这给了我错误Connection is not closed
.
PrimaryInitializerTest
类
protected override void Seed(PrimaryContextTest context)
{
// (...) Input some values
base.Seed(context);
}
Run Code Online (Sandbox Code Playgroud)
PrimaryContextTest
类
public class PrimaryContextTest : DbContext
{
public PrimaryContextTest() : base("PrimaryContextTest")
{
Database.SetInitializer(new DropCreateDatabaseAlways<PrimaryContextTest>());
}
public DbSet<Story> Stories { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) …
Run Code Online (Sandbox Code Playgroud)