实体框架:使用函数导入在存储过程中更新和重新选择实体时缓存实体
本文关键字:实体 新选择 缓存 选择 更新 过程中 框架 函数 存储 导入 存储过程 | 更新日期: 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