我阅读了一份VehicleMovementEvent
物品清单,其中大部分是停车场区域的简单入口和出口。这些有一个入口或出口的指示器,以及一个日期和时间。我使用此列表生成一个对象列表,VehiclePresence
这些对象告诉我从开始时间到结束时间在区域 x 中存在车辆,从两个匹配的VehicleMovementEvent
对象中收集。我只想处理整个列表,或者什么都不处理,所以交易似乎很合适。
我不经常在代码中使用事务,那么,我这样做对吗?特别是隔离级别等。
var opts = new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead, Timeout = new TimeSpan(0, 0, 10, 0) };
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, opts))
{
var vehicleMovements = startsbatch.Movements
.Where(m => m.MovementType.Direction == VehicleMovementEventType.Entry)
.OrderBy(m => m.EmpNo)
.ThenBy(m => m.MovementDateTime);
presenceBatch.StartDateTime = DateTime.Now;
presenceBatch.MovementBatch = startsbatch;
_dbContext.VehiclePresenceBatches.Add(presenceBatch);
_procTrace.TraceInformation("New VehiclePresencesBatch created. Id: {0}.", presenceBatch.Id);
foreach (var movement in vehicleMovements)
{
var presence = new VehiclePresence
{
PresenceBatch = presenceBatch,
EmpNo = movement.EmpNo,
Location = movement.Location,
StartDateTime = movement.MovementDateTime,
StartMovementBatchId = movement.BatchId,
StartMovementLineId = movement.LineId,
StartMovementId = movement.Id
};
_dbContext.VehiclePresences.Add(presence);
returnList.Add(presence);
}
_dbContext.SaveChanges();
scope.Complete();
_procTrace.TraceInformation("{0} VehicleMovements processed. {1} VehiclePresences created", vehicleMovements.Count(), returnList.Count);
}