nHibernate映射问题--为空,而不是删除子代和孙代



区块报价

我们正在使用ByCode方法映射数据。。

我有一个Process(Process table)对象,它有一个ProcessStep(ProcessStep table)对象列表,它又有一个分配给每个步骤的ProcessStepUser(ProcessStepUser table)对象包。

对象加载得很好,但在网页中,如果我从集合中删除一个Step,将其重新水合为MVC操作作为进程,然后保存该进程,则数据库中的Step只会将ProcessId设置为null,从而断开链接,但会将Step留在数据库中及其所有分配的用户中。

我想做的是删除一个步骤,并删除其ProcessStep和所有ProcessStepUsers。

同样,当我编辑一个ProcessStep(比如说我更改了步骤的名称)并保存时,它会保存它,但ProcessStep用户会被清空(从他们的ProcessStepId中)并重新创建,留下孤立的记录。

我在ProcessStepUser上也有一个列,用于显示整个ProcessId,这样我就可以防止用户被多次分配到流程的任何步骤。

我的相关映射如下:

流程:

            List(x => x.ProcessSteps, m =>
                           {
                               m.Key(k => k.Column("ProcessId"));
                               m.Index(i => i.Column("StepOrder"));
                               m.Lazy(CollectionLazy.NoLazy);
                               m.Cascade(Cascade.All);
                       m.Inverse(false);
                           },
             r => r.OneToMany(o => o.Class(typeof (ProcessStep))));

处理步骤:

            Bag(x => x.ProcessStepUsers, m =>
        {
            m.Key(k => k.Column("ProcessStepId"));
            m.Lazy(CollectionLazy.NoLazy);
            m.Cascade(Cascade.All);
            m.Inverse(false);
        },
        r => r.OneToMany(o => o.Class(typeof (ProcessStepUser))));
        ManyToOne(x => x.Process, m =>
        {
            m.Column("ProcessId");
            m.Class(typeof (Process));
                     });

ProcessStepUser

            ManyToOne(p => p.Step, m =>
                               {
                                   m.Column("ProcessStepId");
                                   m.Class(typeof (ProcessStep));
                               });
        ManyToOne(p => p.Process, m =>
        {
            m.Column("ProcessId");
            m.Class(typeof (Process));
        });

正如我所说,它在创建时保存得很好,在显示时加载得也很好。但是,删除一个步骤或编辑一个步骤会对数据库造成严重破坏。

我通过标记它们并在保存process master对象之前手动删除它们来破解步骤删除过程,但如果可能的话,我希望nhibernate能完成所有操作。

谢谢!

区块报价

首先感谢Martin发现了Cascade.All.Include(Cascade.DeleteOrphans)的一个问题……这是我的原始代码,我在试图解决问题时忘记了我已经更改了它。

我重写了一些测试,映射实际上运行得很好,所以很抱歉。我会删除这个问题,但网站不允许我做任何事情(在Firefox中),但编辑。。。

最终出现的问题是,我从数据库中获取Process对象,然后将其作为JSON对象序列化到View。然后,我将绑定回Process对象的JSON对象传回。

总之,我们的存储库正在对对象调用SaveOrUpdate(obj),但由于它已经断开连接,我们需要调用Merge(obj。

我把这个问题是否还有价值留给当权者。

谢谢!

在您希望删除关联的关联上尝试Cascade(Cascade.AllDeleteOrphan),而不是将另一侧为空。。。

最新更新