0

在 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 探查器:

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
4

1 回答 1

1

找到了:

由于“id”列是长类型,我必须将其转换为正确的类型。

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

现在它按预期工作。

于 2013-11-19T08:21:41.867 回答