LINQ to SQL Transaction,当Transaction类型为Table

本文关键字:Transaction Table 类型 to SQL LINQ | 更新日期: 2023-09-27 18:01:23

我试图创建一个事务来包装几个LINQ to SQL SubmitChanges()调用。

System.Data.Common.DbTransaction trans = null;
using (DbContext context = new DbContext())
{
    context.Connection.Open()
    trans = context.Connection.BeginTransaction();
    context.Transaction = trans; // <-- ERROR HERE: Cannot be done!
    .... // Several calls to delete objects with context.SaveChanges()
    trans.Commit();
}

在我们的数据库模式(早于我,并且与应用程序紧密相连)中,我们有一个名为Transaction的表。

这意味着上面代码中的Transaction属性实际上不是IDbTransaction类型,并且我无法将trans对象分配给context.Transaction。context.Transaction实际上是Table<Transaction>型。

<标题>

我如何将事务分配给我的上下文,给定当前不可更改的事实,我有一个名为transaction的表?

虽然我熟悉LINQ to SQL,但这是我第一次在多个调用中使用Transaction,所以我也准备接受我可能没有正确的方式来做这件事,并且冲突的表名甚至可能不是一个问题…

LINQ to SQL Transaction,当Transaction类型为Table<Transaction>

如果DataContextTransaction属性被您的DbContext类隐藏,只需转换:

((DataContext) context).Transaction = trans;

这样Transaction就会被编译器解析为DataContext.Transaction而不是DbContext.Transaction

或者,您可以使用一个单独的变量,这可能是有用的,如果您有几个这样的调用:

DataContext vanillaContext = context;
vanillaContext.Transaction = trans;

(我不知道这是否是使用事务的正确方式-它只是绕过命名冲突的方法)