Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用NHibernate Castle设施延迟加载_Nhibernate_Castle Windsor_Lazy Loading_Castle_Windsor Nhfacility - Fatal编程技术网

使用NHibernate Castle设施延迟加载

使用NHibernate Castle设施延迟加载,nhibernate,castle-windsor,lazy-loading,castle,windsor-nhfacility,Nhibernate,Castle Windsor,Lazy Loading,Castle,Windsor Nhfacility,我是否必须关闭Castle的ISessionManager为NHibernate生成的ISession?我如何处理那些I会话的事务?我对NHibernate还是个新手 编辑:我希望延迟加载,但收到以下消息: 初始化[延迟失败] 初始化角色的集合:,否 “会话或会话已关闭” 这是我的通用存储库,我继承它来实现特定实例 [Transactional] public class Repository<TKey, TModel> : IRepository<TKey, TMod

我是否必须关闭Castle的ISessionManager为NHibernate生成的ISession?我如何处理那些
I会话
的事务?我对NHibernate还是个新手

编辑:我希望延迟加载,但收到以下消息:

初始化[延迟失败] 初始化角色的集合:,否 “会话或会话已关闭”

这是我的通用存储库,我继承它来实现特定实例

[Transactional]
public class Repository<TKey, TModel>
    : IRepository<TKey, TModel>
    where TKey : IComparable
    where TModel : class
{
    private readonly ISessionManager _sessionManager;

    protected ISession Session { get { return _sessionManager.OpenSession(); } }

    public Repository(ISessionManager sessionManager)
    {
        _sessionManager = sessionManager;
    }
    #region IRepository<TKey,TModel> Members

    public virtual TModel Select(TKey key)
    {
        using (var session = _sessionManager.OpenSession())
        {
            return session.Get<TModel>(key);
        }
    }

    public virtual IList<TModel> SelectWhere(Func<TModel, bool> query)
    {
        using (var session = Session)
        {
            return session.Linq<TModel>().Where(query).ToList();
        }
    }

    public virtual TModel Single(Func<TModel, bool> query)
    {
        using (var session = Session)
        {
            return session.Linq<TModel>().SingleOrDefault(query);
        }
    }

    public virtual TModel First(Func<TModel, bool> query)
    {
        using (var session = Session)
        {
            return session.Linq<TModel>().FirstOrDefault(query);
        }
    }

    public virtual IList<TModel> All()
    {
        using (var session = Session)
        {
            return session.Linq<TModel>().ToList();
        }
    }

    [Transaction(TransactionMode.Requires)]
    public virtual void Store(TModel entity)
    {
        using (var session = Session)
        {
            session.SaveOrUpdate(entity);
        }
    }

    [Transaction(TransactionMode.Requires)]
    public virtual void Store(IEnumerable<TModel> entities)
    {
        using (var session = Session)
        {
            foreach (TModel entity in entities)
                session.SaveOrUpdate(entity);
        }
    }


    [Transaction(TransactionMode.Requires)]
    public virtual void Remove(TModel entity)
    {
        using (var session = Session)
        {
            session.Delete(entity);
        }

    }

    public virtual void Remove(Func<TModel, bool> query)
    {
        IEnumerable<TModel> entities = SelectWhere(query);
        Remove(entities);
    }

    [Transaction(TransactionMode.Requires)]
    public virtual void Remove(IEnumerable<TModel> entities)
    {
        using (var session = Session)
        {
            foreach (TModel entity in entities)
                session.Delete(entity);
        }
    }

    #endregion
}

public class Repository<TModel>
    : Repository<Guid, TModel>, IRepository<TModel>
    where TModel : class
{
    public Repository(ISessionManager sessionManager) : base(sessionManager) { }
}

public class Repository
    : Repository<ulong, object>, IRepository
{
    public Repository(ISessionManager sessionManager) : base(sessionManager) { }
}

是,请始终处理
会话
。请参阅

对于事务,请考虑使用.< /P> 因此,即使您显然已经处理了
ISession
,它也会在需要时巧妙地处理
ISession
,并将事务考虑在内


它使用ASP.NET MVC+Castle自动事务处理工具+NHibernate工具

我们使用带有语句的事务来处理事务

public void Save<K>(K entity)
        {

            if (entity == null)
                throw new ArgumentNullException("item", "The item being saved cannot be null.");

            using (ISession session = GetSession())
            {
                using (ITransaction tx = session.BeginTransaction())
                {
                    session.SaveOrUpdate(entity);
                    tx.Commit();
                }
            }
        }
公共作废保存(K实体)
{
if(实体==null)
抛出新ArgumentNullException(“项”,“正在保存的项不能为null”);
使用(ISession session=GetSession())
{
使用(ITransaction tx=session.BeginTransaction())
{
会话。保存或更新(实体);
tx.Commit();
}
}
}
如果在同一操作中进行修改后访问对象,我仍然会遇到延迟加载错误。我已通过在保存后不访问对象修复了此错误。以下是解释:


我认为这是因为没有正确保存层次结构。我还没有测试它,但如果您希望访问父对象,可能保存它们会解决问题。只需在保存后将需要访问的信息放入局部变量中,然后再保存,就可以解决我的问题。

您真正需要的是一些示例代码。请参阅nd测试:你能告诉我一个显示延迟加载功能的文件吗?你注册了sessionwebmodule吗?你在使用ATM吗?你的事务类是否用[transactional]和[Transaction]修饰?请发布一些代码。存储库代码看起来不错。你能发布一个调用存储库的方法吗?
public void Save<K>(K entity)
        {

            if (entity == null)
                throw new ArgumentNullException("item", "The item being saved cannot be null.");

            using (ISession session = GetSession())
            {
                using (ITransaction tx = session.BeginTransaction())
                {
                    session.SaveOrUpdate(entity);
                    tx.Commit();
                }
            }
        }