实体框架:使用函数导入在存储过程中更新和重新选择实体时缓存实体

本文关键字:实体 新选择 缓存 选择 更新 过程中 框架 函数 存储 导入 存储过程 | 更新日期: 2023-09-27 18:16:00

我使用EF4与Visual Studio 2010和SQL Server 2008 R2。

我正在选择一个实体。之后,我调用一个存储过程,它更新实体并从数据库中重新选择它。当我在代码中捕获存储过程的结果时,我看到旧的(以前选择的)属性。

显然,我正在查看缓存的实体值。是否有办法通知EF我的实体已更新?还是某种神奇的属性?

我的数据库表(和实体)看起来像这样:

CREATE TABLE [Message]
(
    ID int IDENTITY(1, 1) PRIMARY KEY,
    Content XML,
    StateID int NOT NULL,
)

我的SP是这样的:

CREATE PROCEDURE sp_Queue_s
AS
BEGIN
    DECLARE @queue table ([ID] int NOT NULL)
    BEGIN TRAN
        INSERT INTO @queue
        SELECT [ID]
        FROM [Message]
        WHERE   StateID = 1
        UPDATE [Message]
        SET StateID = 2
        WHERE ID IN (SELECT ID FROM @queue)
    COMMIT TRAN
    -- Select the queue
    SELECT [ID], [Content], [Message]
    FROM [Message]
    WHERE [ID] IN (SELECT ID FROM @queue)
END

我的c#代码看起来像这样:

using (var context = new MyEntities())
            {
                int id = 1;
                var message = context.Messages.Single(m => m.ID == id);
                var messages = context.GetQueue(); // Function import of sp_Queue_s, maps on the Message entity
                var messageUpdated = messages.Single(m => m.ID == id);
            }

实体框架:使用函数导入在存储过程中更新和重新选择实体时缓存实体

GetQueue应该是内部调用context.ExecuteFunction的生成方法。ExecuteFunction有多个过载,其中一个接受MergeOption。尝试用MergeOption.OverwriteChanges直接呼叫ExecuteFunction