2012-10-11 52 views
0

我是EntityFramework的新手。我面临一个非常奇怪的问题。我无法使用linq实体查询使用事务。我用于DbTransaction以及TransactionScope。只要查询命中,就会发生错误。我正在使用EF 4.3。上下文像往常一样从DbContext派生。我正在使用Code First方法。与linq交易使用实体

 using (TransactionScope s = new TransactionScope()) 
     { 
     using(var context = new XYZContext()) 
     { 
       context.Database.Connection.Open(); 
       Int32 count = (from xyz in context.XYZs 
          where xyz.Name == "SameName" 
          select xyz.Name).Count(); 
       Assert.AreEqual(count, 1); 
      } 
     } 

我有些疑惑。我不想使用TrasactionScope,因为我听说它有性能问题。那么,我该如何使用DbTransaction来代替(也为我抛出错误)呢? 为什么我需要明确打开连接?当我正在'上传'一个上下文时,它是否应该不会自动为我打开连接?

+1

的可能的复制http://stackoverflow.com/questions/5222734/how-to-perform-a-transaction-with-an-entity-framework-object-context?rq=1 –

+0

@Vaibhav:根据你的代码,我不认为你需要维护任何交易(作为一个选择语句)。 –

+2

请将错误添加到您的问题描述! – riezebosch

回答

1

尝试翻转使用的子句,并在开始事务之前打开连接,并使用上下文打开事务。如果您的代码正在进行更新,您还需要提交事务。

using(var context = new XYZContext()) 
    { 
     context.Database.Connection.Open(); 
     using (TransactionScope s = context.Connection.BeginTransaction()) 
     { 

      Int32 count = (from xyz in context.XYZs 
          where xyz.Name == "SameName" 
          select xyz.Name).Count(); 
      Assert.AreEqual(count, 1); 
      s.Commit() 
     } 
    } 
+0

该解决方案适用于连接开放声明注释。另外,我想使用DbTransaction而不是TransactionScope。 –