首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法访问已释放的对象。用XPO

无法访问已释放的对象。用XPO
EN

Stack Overflow用户
提问于 2015-02-16 17:37:37
回答 1查看 2.5K关注 0票数 1

我正在尝试坚持一个XPObject。这是我的密码:

代码语言:javascript
复制
Administrateur adm = (Administrateur)GetUserByLogin("admin");
Client clt = (Client)GetUserByLogin("client");
using(var uow = new UnitOfWork())
                {
                    Calendrier cal = new Calendrier(uow)
                    {
                        //Some string and int attributes
                        Administrateur = adm,
                        Client = clt
                    };
                    uow.CommitChanges();
                }

GetUserByLogin是一个返回Utilisateur对象的方法,其中Administrateur和Client从Utilisateur继承。

我测试了GetUserByLogin,它运行得很好。当我运行上面的代码时,我得到的是:

S

代码语言:javascript
复制
ystem.ObjectDisposedException: Cannot access a disposed object.
Object name: 'ASTDataLayer.POCO.Administrateur(1004)'.
   at DevExpress.Xpo.PersistentBase.get_Session()
   at DevExpress.Xpo.Session.ThrowIfObjectFromDifferentSession(Object obj)
   at DevExpress.Xpo.Metadata.XPMemberInfo.ProcessAssociationRefChange(Session s
ession, Object referenceMemberOwner, Object oldValue, Object newValue, Boolean s
kipNonLoadedCollections)

请帮忙,谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-17 07:56:39

代码语言:javascript
复制
using (UnitOfWork uow = new UnitOfWork() {
  // Do something
}

using (UnitOfWork uow = new UnitOfWork() {
  // Do something
  return persistentObjectOrCollectionOfPersistentObjects;
}

对于何时以及如何释放会话或UnitOfWork存在很大的混淆。上面的代码片段说明了正确和不正确的方法。 如果创建UnitOfWork或会话实例只是为了在当前上下文中执行某些操作,则可以安全地释放UnitOfWork或会话实例。但是,如果将持久对象传递给另一个函数,则不应立即释放会话或UnitOfWork。 在后一种情况下,处理UnitOfWork/Session实例的任务变得很棘手。您必须确保在您释放会话/UnitOfWork之后,您的代码都不会使用由Session/UnitOfWork加载的持久对象。

您发布的代码不包含可能导致收到的异常的错误。我认为这个错误存在于GetUserByLogin方法中。否则,很难想象以后您还会在哪里释放代码中使用的会话实例。

GetUserByLogin方法很可能创建一个新的会话实例。显然,这是必要的,是无法避免的。但是这个方法不能释放会话,因为它返回一个持久对象作为结果。稍后将使用此对象,并且可以为特定目的访问会话。在使用GetUserByLogin方法的代码中正确地释放会话。

然而,还有另一个问题。由于您的应用程序逻辑需要在同一个上下文中多次调用GetUserByLogin方法,所以如果您尝试在一起使用返回的对象,您将混合不同的会话。例如,将它们分配给第三个对象的引用属性。顺便说一句,你就是这么做的。

因此,我的建议是修改GetUserByLogin方法,以便它接受会话作为参数。在这种情况下,您将始终确保使用的是单个会话实例,并且可以在退出上下文之前将其释放。

代码语言:javascript
复制
using(var uow = new UnitOfWork())
{
    Administrateur adm = (Administrateur)GetUserByLogin(uow, "admin");
    Client clt = (Client)GetUserByLogin(uow, "client");
    Calendrier cal = new Calendrier(uow)
    {
        //Some string and int attributes
        Administrateur = adm,
        Client = clt
    };
    uow.CommitChanges();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28547176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档