nHibernate Mapping问题 - 无效,不删除子孙

时间:2013-02-12 21:19:23

标签: nhibernate nhibernate-mapping mapping-by-code

  

块引用

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

我有一个Process(Process table)对象,它有一个ProcessStep(ProcessStep表)对象List,而这些对象又分配了一个ProcessStepUser(ProcessStepUser表)Bag对象。

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

我希望能够删除一个步骤并删除其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))));

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对象,然后将其序列化为View作为JSON对象。然后我传回了JSON对象,该对象被绑定回Process对象。

我的存储库是在对象上调用SaveOrUpdate(obj),但是由于它已经断开连接,我们需要调用Merge(obj),我们这样做并完美地工作。

我将其留给了这个问题是否有任何价值的权力。

谢谢!

1 个答案:

答案 0 :(得分:1)

尝试使用Cascade(Cascade.AllDeleteOrphan)来关联你想要删除它们的关联,而不是让另一方被删除......