我在Entity Framework中使用了一个事务。但我不知道在哪里放置交易范围。应该在开始之前,在我为实体做一些处理之前。或者我应该在实体处理之后但在我调用save之前将它放入。因为我读到交易应该尽可能短。
我应该这样做吗
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
using (var context = new MyDbContext(conn, contextOwnsConnection: false))
{
var query = context.Posts.Where(p => p.Blog.Rating > 5);
foreach (var post in query)
{
post.Title += "[Cool Blog]";
}
await context.SaveChangesAsync();
}
}
或者这个(保存/提交之前的最后范围)
using (var context = new MyDbContext(conn, contextOwnsConnection: false))
{
var query = context.Posts.Where(p => p.Blog.Rating > 5);
foreach (var post in query)
{
post.Title += "[Cool Blog]";
}
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
await context.SaveChangesAsync();
}
}
答案 0 :(得分:0)
为了回答您的问题,我们首先要了解为什么我们开始使用交易范围。 e.g。
让我们想象你想买一辆车,但你已经拥有了一辆车,所以你想交易你的车。
public bool TradeCar(Car myCar, Car otherCar)
{
otherCar.Owner = "Me";
myCar.Owner = "Other Dude";
return true;
}
现在想象一下,应用程序在myCar.Owner = "Other Dude"
行中出于某种原因崩溃,现在你有2辆车!
如果你是一个小偷,那真是太好了,但我们都是好人,我们希望一切尽可能顺利。
所以我们添加一个事务范围!
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
otherCar.Owner = "Me";
myCar.Owner = "Other Dude";
return true;
}
现在,如果你的代码因任何原因崩溃,你们两个都保证不会失去他们的车!
因此,只要你没有做任何想象,你就可以将事务范围放在一边,如果我打算用数据库做更多的操作,我通常会在调用开始时使用它。