1

我们正在为我们的数据层使用实体框架。

对于某些验证,我们需要访问可能仍在数据库中的实体。我们希望它确保有问题的数据不会改变,所以我们包装保存(并在事务中验证)

在调用 SaveChanges() 时在上下文的 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:底层提供程序在打开时失败”,这反过来是由于 EF 尝试使用 MSDTC 将我的事务转换为分布式事务的事实引起的。我如何才能只获得一个 SQL Server 事务来进行验证并保存?

4

0 回答 0