我们正在为数据层使用Entity Framework。
对于某些验证,我们需要访问可能仍在DB中的实体。我们希望它确保所讨论的数据不会发生变化,因此我们将保存(和事务中的验证)包装起来
当调用SaveChanges()时,在Context的Database.Connection上启动一个事务。
因此我们在覆盖SaveChanges()时使用事务范围。剥离错误处理等,它看起来像这样:
...
using (scope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
countSaves = base.SaveChanges();
scope.Complete();
}
return countSaves;
...
要使DbContext可用于验证,它将被放置在ValidateEntity方法的Items字典中。
我们有一个自定义验证属性,如下所示:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class CodeListAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext context)
{
MyDbContext model = (MyDbContext)context.Items["model"];
IList<Code> validCodes = model.Codes.Where(…).ToList();
…
}
...
}
读取model.Codes给出“System.Data.EntityException:底层提供程序在Open上失败”,而这又是由于EF尝试使用MSDTC将我的事务转换为分布式事务的事实引起的。 如何为验证仅获取单个SQL Server事务并保存?