相关疑难解决方法(0)

如何在 EF Core 中实现 Select For Update

据我所知,EF(和 EF Core)中没有选项可以显式锁定我正在查询的资源,但我会经常需要这个功能,并且真的不想回到写作每次我需要它时都选择语句。

因为我只需要它用于 postgres 并且根据规范 FOR UPDATE是查询中的最后一项,所以我想到实现它的最简单的方法是获取如下所述的 select 语句:在 Linq to Entities 中,您能否将 IQueryable 转换为字符串SQL?并附加FOR UPDATE并直接执行它。然而,这要么给我一个带有参数占位符的查询,要么不是一个准备好的查询,这意味着执行计划的缓存不会真正在 postgres 上工作,所以无论哪种方式都行不通。

Linq to SQL 有这个方法,DataContext.GetCommand但在 EF 和特别是 EF Core 中似乎没有任何等效的东西。我还查看了 EntityFramework.Extended 及其批量更新/删除,但由于他们必须将 select 语句转换为不同的语句,因此他们需要处理比我复杂得多的问题,因此我希望有一个更简单的解决方案。

更新:

如果描述不清楚,我想创建一个这样的扩展方法:

public static IList<T> ForUpdate (this IQueryable<T> me)
{
    // this line is obviously what is missing for me :)
    var theUnderlyingCommand = me.GetTheUnderlyingDbCommandOrSimilar();

    theUnderlyingCommand.Text += "FOR UPDATE";
    return me.ToList();
}
Run Code Online (Sandbox Code Playgroud)

这样,其他开发人员可以像所有其他过程一样通过 Linq 使用 EF,而不是运行.ToList()他们会运行.ForUpdate(). …

postgresql entity-framework npgsql entity-framework-core

6
推荐指数
1
解决办法
8348
查看次数

获取Entity Framework中业务对象的TraceString

如何获取此类查询的跟踪字符串:

var product = _context.Products.Where( p => p.Category == "Windows" )
                               .SingleOrDefault();

// I can't do this since product is not an ObjectQuery instance
// product.ToTraceString();
Run Code Online (Sandbox Code Playgroud)

c# entity-framework entity-framework-4

0
推荐指数
2
解决办法
2533
查看次数