C# Nhibernate递归结构中正确的多线程会话处理

C# Nhibernate递归结构中正确的多线程会话处理,c#,multithreading,session,nhibernate,concurrency,C#,Multithreading,Session,Nhibernate,Concurrency,我有一些递归结构,如: Folder+ | +A+AA+AAA +AAB +AAC +AB +AC +B +C 我想用多个线程处理这个结构,所以我使用了TPL数据流,如下所示: m_dataOperationQueue = new ActionBlock<Folder>(x => ProcessFolder(x) , n

我有一些递归结构,如:

Folder+
      |
      +A+AA+AAA
           +AAB
           +AAC
        +AB
        +AC
      +B
      +C
我想用多个线程处理这个结构,所以我使用了TPL数据流,如下所示:

     m_dataOperationQueue = new ActionBlock<Folder>(x => ProcessFolder(x)
            , new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 5 });
    [Transaction(TransactionMode.Requires)]
    public virtual Folder SaveNewFolder(Folder folder)
    {
        using (var session = SessionManager.OpenSession())
        {
           session.Save(folder); //At this line i have most errors
        }
    }

我可以从你的方法中看出一些问题

  • 当您递归保存文件夹时,确实会先保存父文件夹并将子文件夹排入队列以进行处理,但问题是当您持久化时,NHibernate将继续并持久化所有AA、AAA、AAB…、AB。。。层次结构仅仅是因为A将引用AA..AB。因此,在单独的线程中保存子文件夹将不起作用,因为它们已经持久化了,而在另一个线程中,A没有正确持久化

  • 一旦你处理了父文件夹,它就会被删除。当您删除父实体时,子实体很可能也会被删除,并且在另一个线程中,您正试图持久化父实体被删除的子实体,这将使NhHbernate非常困惑


  • 哦,关于1和2我都知道。我要做的是将整个结构保存到db中,然后我想将顶层排队进行处理。另外,当我完成parrent的处理时,我不会删除子对象(这里没有级联),我只会更新并使子对象孤立->从而使它们成为新的parrent