【问题标题】:Get output 'inserted' on update with Entity Framework使用实体框架更新时获取“插入”输出
【发布时间】:2018-09-26 05:43:46
【问题描述】:

SQL Server 使用 'inserted' 关键字为插入和更新的记录提供输出。

我有一个代表处理队列的表。我使用以下查询来锁定记录并获取锁定记录的 ID:

UPDATE TOP (1) GlobalTrans
SET LockDateTime = GETUTCDATE()
OUTPUT inserted.ID
WHERE LockDateTime IS NULL

这将输出一个名为 ID 的列,其中包含所有更新的记录 ID(在我的例子中是一个 ID)。如何将其转换为 C# 中的 EF 以执行更新并取回 ID?

【问题讨论】:

标签: c# entity-framework tsql entity-framework-6


【解决方案1】:

获取数据表的简单示例#1:

我直接针对连接执行此操作: 将 command.ExecuteNonQuery() 更改为 command.ExecuteReader()

        var connection = DbContext().Database.Connection as SqlConnection;

        using (var command = connection.CreateCommand())
        {
            command.CommandText = sql;
            command.CommandTimeout = 120;
            command.Parameters.Add(param);

            using (var reader = command.ExecuteReader())
            {
                var resultTable = new DataTable();
                resultTable.Load(reader);
                return resultTable;
            }
        }

仅供参考,如果您的 SQL 中没有 OUTPUT 子句,它将返回一个空数据表。

返回实体的示例 #2:

这有点复杂,但确实有效。 使用插入了 OUTPUT 的 SQL 语句。*

         var className = typeof(T).Name;
         var container = ObjContext().MetadataWorkspace.GetEntityContainer(UnitOfWork.ObjContext().DefaultContainerName, DataSpace.CSpace);
         var setName = (from meta in container.BaseEntitySets where meta.ElementType.Name == className select meta.Name).First();

         var results = ObjContext().ExecuteStoreQuery<T>(sql, setName, trackingEnabled ? MergeOption.AppendOnly : MergeOption.NoTracking).ToList();

T 是正在处理的实体

【讨论】:

    【解决方案2】:

    Entity Framework 无法做到这一点。

    您可以通过选择所有记录、设置它们的 LockDateTime 并将它们写回来以 ORM 方式进行操作。这对于您想要做的事情可能不安全,因为默认情况下它不是一个单一的交易。

    您可以跨越自己的事务并使用RepeatableRead 作为隔离级别。那应该行得通。根据您的数据库在后台执行的操作,这可能有点过头了。

    您可以编写 SQL by hand。这违背了实体框架的目的,但就锁定机制而言,它应该和以前一样安全。

    您也可以将其放入存储过程and call that。它比上面的版本好一点,因为至少有有人会编译它并检查表名和列名是否正确。

    【讨论】:

    • 就个人而言,我会使用存储过程方法。我总是鼓励应用程序层和数据层不耦合(在任何可能的范围内)。sproc 允许您将任意和自定义逻辑应用于插入,并且还可以批量管理它们。
    猜你喜欢
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2014-10-09
    • 2012-06-29
    相关资源
    最近更新 更多