1

我的通用存储库中有一个方法:

public IQueryable<T> Query<T>() where T : class, IEntity
{
   return _context.Set<T>();
}

这是获取用户的方法:

public User GetUser(string email)
{
   return _repository.Query<User>().FirstOrDefault(u => u.Email == email);
}

最后,我让用户进入会话:

AppSession.CurrentUser = UserService.GetUser(email);

在我的操作中,我需要获取当前用户并获取对象集合Notifications(一对多):

AppSession.CurrentUser.Notifications.OfType<EmailNotification>().FirstOrDefault();

但是,在这里我得到了错误:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

我知道当我从数据库Notifications获取时没有加载。 怎么说EF来加载对象?我知道,但我不能在方法中使用它。User
NotificationsIncludeGetUser

4

2 回答 2

2

当第一个 HttpRequest 在查找您的CurrentUser对象后结束时,您对其他查找(如 EmailNotifications)的_repository引用不可用。CurrentUser

抛出异常是因为CurrentUser没有原始对象上下文,因此您必须将 CurrentUser 对象附加到您_repository正在使用的新 objectContext,或者使用更简单的解决方案,即通过创建的新上下文重新加载用户您当前在存储库中的请求。

在尝试在您的操作中查找通知之前,添加以下行:

AppSession.CurrentUser = UserService.GetUser(AppSession.CurrentUser.Email);
AppSession.CurrentUser.Notifications.OfType<EmailNotification>().FirstOrDefault();
于 2013-03-14T08:08:27.497 回答
1

正如@Ryan所说,这是因为对象上下文不可用于关联通知中的延迟加载。

我的建议是关闭延迟加载(如果可能),因为以后可能会导致很多问题,然后执行类似...

var user = UserService.GetUser(AppSession.CurrentUser.Email);
user.Notifications = NotificationService.GetUserNotifications(user.Id /* or another identifier */);
AppSession.CurrentUser = user;

为此,您将需要一个新的 NotificationService,它可以加载(如上所述)但也可以处理通知的执行(发送电子邮件等)。

您现在应该在应用程序会话缓存中拥有该用户的通知。

高温高压

于 2013-03-14T08:28:16.643 回答