区块报价
我们正在使用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),而不是将另一侧为空。。。