实体框架:在单个SQL事务中验证和保存数据

时间:2013-07-03 13:10:43

标签: entity-framework

我们正在为数据层使用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事务并保存?

0 个答案:

没有答案