[英]Parallel transaction issue using custom UOW with ORM(EF6)
我尝试将通用存储库和UOW模式与Entity Framework一起实现为ORM的一些背景知识。我已经使用方法编写了自定义UnitOFWork类
1.BeginTransaction。 2.CommitTransaction 3.RollBackTransaction 4.SaveChanges 5.IsInTransaction 6.Dispose。
public class UnitOfWork: IUnitOfWork
{
private DbTransaction transaction;
private readonly DbContext context;
public UnitOfWork(DBContext dbContext )
{
context = dbContext ;
}
public void Begintransaction()
{
transaction = context.Database.Connection.BeginTransaction(isolationLevel);
}
public void CommitTransaction()
{
context.SaveChanges();
transaction.Commit();
ReleaseCurrentTransaction();
}
....
....
}
我的通用存储库类
public class Repository : IRepository
{
private dbContext;
protected DBContext Context
{
get
{
return dbContext != null? dbContext : dbContext = GetContextFromFactory();
}
}
public void Add<T>(T entity)
{
dbContext.Set<T>.Add(entity);
}
}
我的个人资料库。
public class PersonRepository : Repository
{
public void AddPerson(Person person)
{
using(var uow = new UnitOfWork(Context)
{
try
{
uow.BeginTransaction();
Add(person);
uow.CommitTransaction();
}
catch (Exception ex)
{
uow.RollBackTransaction();
log.Error("This Exception:",ex);
}
}
}
}
var repo = new PersonRepository();
Person person = GetPerson();
repo.AddPerson(person);
当我运行此代码以保存人员对象时,它将在UOW的CommitTransaction()方法中的context.SaveChanges()上引发异常。 例外是“ SqlConnection不支持并行事务。”
非常感谢您的建议和意见。
[更新]我已通过使上下文接受已经存在的当前交易来解决此问题。 我的解决方法是在代码CommitTransaction()中。我需要您的注释。
由此。
public void CommitTransaction()
{
context.SaveChanges();
transaction.Commit();
ReleaseCurrentTransaction();
}
对此。
public void CommitTransaction()
{
context.UseTransaction(this.transaction);
context.SaveChanges();
transaction.Commit();
ReleaseCurrentTransaction();
}
这种方法有什么缺点吗? 请分享您的评论。
通过消息队列进行交易。 用于消息队列的EF和事务范围有关何时可能要在EF 中使用事务的一般信息有关使用事务的注意事项以及在EF中的操作方法
尽快处置上下文实例。 一般建议定期更新
连接字符串:请参见MultipleActiveResultSets = true
<connectionStrings>
<add name="myConn" connectionString="Data Source=localhost;Initial Catalog=MyDbName ;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.