【发布时间】:2011-11-24 14:40:25
【问题描述】:
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 读取已保存在 db 中的所有条目。 我怎样才能避免这种情况?
更新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);
}
然而,我不喜欢这样,因为从层分离的角度来看,这是一种 hack。 这里我要知道存储列的名称。那不行。
更新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#?如果有,请添加相关标签。
-
你在这个上面运行了 sql profiler 吗?它实际上是从数据库中获取实体吗?
-
您使用的是哪个版本的实体框架?您还可以查明导致它拉出所有实体的代码行
-
代码优先?架构优先?如果 Code-First,你能发布你的上下文类吗?
-
您的上下文是否具有具有该用户 ID 的实体 User 以及用于获取用户记录的历史记录的导航属性?如果是这样,是否有可能通过将您的新条目链接到该用户来启用和触发延迟加载?
标签: c# entity-framework