如何在LINQ to SQL中查找受影响的行数?

问题描述 投票:1回答:5

有没有人知道如何在LINQ to SQL中提交对数据上下文的更改后查找受影响的行数?

起初我做的是这样的事情:

Using db as New MyDataContext()
    db.Users.Attach(modifiedUser, True)
    db.SubmitChanges()

    Dim rowsUpdated As Integer = db.GetChangeSet().Updates.Count
End Using

我已经发现这不起作用

db.GetChangeSet().Updates.Count

只告诉您在调用SubmitChanges()之前将有多少更新。

反正有没有找出实际受影响的行数?

linq-to-sql
5个回答
4
投票

L2S为受影响的每一行发出单独的插入/更新/删除语句,因此计算GetChangeSet结果中的实体将为您提供正确的“受影响行数”*。

如果由于更改冲突或类似情况而无法更新任何行,则在submitchanges期间会出现异常,并且将回滚该事务。

(* = ...有一个例外;如果你有任何可更新的视图,而不是触发器,你可能会遇到这样一种情况:触发器触发了更新的每一行的多个底层行。但这有点像边缘情况...... :))


0
投票

我没有参与LINQ to SQL。但是,我认为这可能是不可能的。

我想到的原因是:在调用SubmitChanges之前,您可以对多个实体进行更新。因此,我想,你所寻找的“受影响的记录”将不会被人知道。


0
投票

由于可能会提交许多不同的操作,因此您很可能无法获取此类信息。

SubmitChanges()命令将提交插入,更新和删除,据我所知,无法检索每个受影响的行数(#rows deleted / updated / inserted等)。正如您已经发现的那样,您所能做的就是看看将会发生什么。

如果您特别想要执行一个操作,则可以使用ExecuteCommand()方法返回受影响的行计数。


0
投票

将此扩展方法添加到app:

  /// <summary>
    /// Saves all chanches made in this context to the underlying database.
    /// </summary>
    /// <returns></returns>
    /// <exception cref="System.InvalidOperationException">
    /// </exception>
    public static int SaveChanges(this System.Data.Linq.DataContext context)
    {
        try
        {
            int count1 = context.GetChangeSet().Inserts.Count + context.GetChangeSet().Updates.Count + context.GetChangeSet().Deletes.Count;
            context.SubmitChanges();
            int count2 = context.GetChangeSet().Inserts.Count + context.GetChangeSet().Updates.Count + context.GetChangeSet().Deletes.Count;
            return count1 - count2;
        }
        catch (Exception e)
        {
            throw new InvalidOperationException(e.Message);
        }
    }

0
投票

按以下顺序调用它,您将获得计数

Dim rowsUpdated As Integer = db.GetChangeSet()。Updates.Count

db.SubmitChanges();

© www.soinside.com 2019 - 2024. All rights reserved.