【问题标题】:Entity Framework: Entity is cached when update and reselecting it in a stored procedure using a function import实体框架:使用函数导入在存储过程中更新和重新选择实体时缓存实体
【发布时间】:2011-11-29 13:45:23
【问题描述】:

我将 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);
            }

【问题讨论】:

  • 能否展示EF为GetQueue方法生成的代码?

标签: c# entity-framework-4


【解决方案1】:

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

【讨论】:

  • 谢谢你!你让我今天一整天都感觉很好!为什么这不是默认的合并选项?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
相关资源
最近更新 更多