Entity framework 不同查询加载的实体框架DBContext导航属性?
我有两个实体,用户和消息。我只喜欢加载消息,而不喜欢加载消息所属的用户 这通常起作用,因为我在linq查询中不包括相关实体。但是,如果我用另一个查询单独加载用户,只从该用户(名称)获取一个字符串,那么它就不起作用了 我正在使用EF 6.1.0、没有代理生成的POCO和WCF服务来传递数据。多余的 导航属性值随后被意外传输Entity framework 不同查询加载的实体框架DBContext导航属性?,entity-framework,Entity Framework,我有两个实体,用户和消息。我只喜欢加载消息,而不喜欢加载消息所属的用户 这通常起作用,因为我在linq查询中不包括相关实体。但是,如果我用另一个查询单独加载用户,只从该用户(名称)获取一个字符串,那么它就不起作用了 我正在使用EF 6.1.0、没有代理生成的POCO和WCF服务来传递数据。多余的 导航属性值随后被意外传输 var message = context.messages.FirstOrDefault(m => m.id == 123); var user = contect.
var message = context.messages.FirstOrDefault(m => m.id == 123);
var user = contect.users.FirstOrDefault(u => u.id = 456);
var message_username_composition = new M_U_C{ m = message, username = user.name };
return message_username_composition;
在这种情况下,即使我不喜欢,也会加载消息的导航属性(用户)
禁用懒散加载没有帮助,只有使用单独的上下文才能解决问题
除了使用两种上下文,还有其他方法吗
这是故意的吗
我也不喜欢手动将导航属性设置为null来解决这个问题,因为它也可能
忘记,因为您没有意识到这种行为。您必须禁用延迟加载并使用
AsNoTracking()
,如下所示:
ctx.Configuration.LazyLoadingEnabled = false;
var message = context.messages.AsNoTracking().FirstOrDefault(m => m.id == 123);
如果设置了
message.User
,您为什么会在意呢?这将是因为EF实现的方式。它知道您的消息与id为456的用户相关,因此它将自动填充属性。在客户端,我仅通过外键更改用户,因为我没有加载所有用户。因此,我必须将导航属性设置为null,这可能会导致错误。此外,如果不需要的话,我也不希望在服务调用结果中包含对象图。我很想知道为什么导航属性会被另一个查询加载。我觉得在这种情况下我无法控制自己的行为。因此,在服务器端,我可能会通过使用相同上下文的助手查询意外地引入包含。Dean:我可以更改该模式的行为吗?或者该解决方案只是一个单独的上下文?haim770:请考虑可能意外通过服务边界的敏感数据!我认为另一种解决方案是使用投影,只选择需要的列。