有没有人知道如何在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()之前将有多少更新。
反正有没有找出实际受影响的行数?
L2S为受影响的每一行发出单独的插入/更新/删除语句,因此计算GetChangeSet结果中的实体将为您提供正确的“受影响行数”*。
如果由于更改冲突或类似情况而无法更新任何行,则在submitchanges期间会出现异常,并且将回滚该事务。
(* = ...有一个例外;如果你有任何可更新的视图,而不是触发器,你可能会遇到这样一种情况:触发器触发了更新的每一行的多个底层行。但这有点像边缘情况...... :))
我没有参与LINQ to SQL。但是,我认为这可能是不可能的。
我想到的原因是:在调用SubmitChanges
之前,您可以对多个实体进行更新。因此,我想,你所寻找的“受影响的记录”将不会被人知道。
由于可能会提交许多不同的操作,因此您很可能无法获取此类信息。
SubmitChanges()命令将提交插入,更新和删除,据我所知,无法检索每个受影响的行数(#rows deleted / updated / inserted等)。正如您已经发现的那样,您所能做的就是看看将会发生什么。
如果您特别想要执行一个操作,则可以使用ExecuteCommand()方法返回受影响的行计数。
将此扩展方法添加到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);
}
}
按以下顺序调用它,您将获得计数
Dim rowsUpdated As Integer = db.GetChangeSet()。Updates.Count
db.SubmitChanges();