为什么调用ObjectSet<T>.AddObject()会获取所有T类型的实体?

4
var he = new LogHistoryEntry
             {
                 ActionId = action.Id,
                 ObjectId = logObject.Id,
                 UserId = user.Id,
                 Info = msg,
                 Item = s.Id,
                 Date = DateTime.Now
             };

ctx.LogHistoryEntries.AddObject(he);

我只想添加一条日志记录,不希望EF读取已经持久化在数据库中的所有记录。我该如何避免这种情况?
更新1:
嗯,我不会称之为解决方案,但这种方法可行。
public static void LogChanges(ObjectContext context, string msg, int itemId, int userId, int logActionId, int logObjectId)
{
    context.ExecuteStoreCommand(
                "insert into log_history (object_id,action_id,item,info,user_id,date) values ({0},{1},{2},{3},{4},GETDATE())",
                logObjectId, logActionId, itemId, msg, userId);
}

然而,从分层的角度来看,我不喜欢这个方法,因为它是一种破解。在这里,我要知道存储列的名称,这是不可取的。

更新2:

这是sql-profiler在AddObject调用时返回的内容:

exec sp_executesql N'SELECT [Extent1].[id] AS [id], [Extent1].[object_id] AS [object_id], [Extent1].[action_id] AS [action_id], [Extent1].[item] AS [item], [Extent1].[info] AS [info], [Extent1].[date] AS [date], [Extent1].[user_id] AS [user_id] FROM [dbo].[log_history] AS [Extent1] WHERE [Extent1].[user_id] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=4

当然,它并不要求所有日志条目,但是为什么它要检查给定用户ID是一个谜。


这是什么语言?C#吗?如果是,请添加相关标签。 - Kerrek SB
1
你在这个上面运行了SQL Profiler吗?它实际上是从数据库中获取实体吗? - Eva Lacy
你使用的是哪个版本的Entity Framework?另外,你能指出导致它拉取所有实体的代码行吗? - Eva Lacy
1
Code-First?Schema-First?如果是Code-First,你能发布你的上下文类吗? - Damien_The_Unbeliever
2
你的上下文中是否有一个名为User的实体,该实体具有该用户ID和导航属性以获取用户的登录历史记录?如果是这样,那么可能启用了延迟加载,并且通过将新条目链接到该用户来触发。 - user743382
显示剩余5条评论
1个回答

0
Hvd是正确的。导致数据库往返的原因是生成了带有修复和启用延迟加载的POCO。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接