【问题标题】:Why does the call to ObjectSet<T>.AddObject() get all entities of type T?为什么调用 ObjectSet<T>.AddObject() 会得到所有类型为 T 的实体?
【发布时间】: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


【解决方案1】:

Hvd 是对的。 db 往返的原因是生成的 POCO 带有修正并启用了延迟加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2013-12-06
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多