EntityFramework 5在同一上下文中两次命中数据库

时间:2013-11-18 08:43:07

标签: entity-framework .net-4.0 first-level-cache

在MSDN for Entity Framework 5中,.Find Methode被描述为:

使用主键值尝试查找上下文跟踪的实体。如果实体不在上下文中,则将执行查询并根据数据源中的数据进行评估... http://msdn.microsoft.com/de-de/library/gg696418(v=vs.103).aspx

但是,当我在同一个上下文中使用'.Find'两次时,也会在数据库中两次。 我想在第一次尝试之后,实体存储在上下文中。 (一级缓存) 我错了什么?

using (var myContext = new TestDbContext(connectionstring))
{
    var firstTry = myContext.Artikel.Find(20);
    Trace.WriteLine("First Try:" + firstTry.Id);

    var secondTry = myContext.Artikel.Find(20);
    Trace.WriteLine("Second Try:" + secondTry.Id);
}

Sql Profiler:

exec sp_executesql N'SELECT TOP (2) 
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name]
FROM [dbo].[Artikel] AS [Extent1]
WHERE [Extent1].[Id] = @p0',N'@p0 int',@p0=20

exec sp_executesql N'SELECT TOP (2) 
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name]
FROM [dbo].[Artikel] AS [Extent1]
WHERE [Extent1].[Id] = @p0',N'@p0 int',@p0=20

1 个答案:

答案 0 :(得分:1)

找到它:

由于'id'列的类型为long,我必须将其强制转换为正确的类型。

var firstTry = myContext.Artikel.Find((long)20);
var secondTry = myContext.Artikel.Find((long)20);

现在它按预期工作。