块引用
我们正在使用 ByCode 方法映射我们的数据..
我有一个 Process (Process 表)对象,它有一个 ProcessStep (ProcessStep 表)对象列表,而该对象又具有一个 Bag of ProcessStepUser (ProcessStepUser 表)对象分配给每个步骤。
对象加载得很好,但是在网页中,如果我从集合中删除一个 Step,将其作为 Process 重新水化为 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));
});
流程步骤用户
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),我们做了并且工作得很好。
我把它留给权力来决定这个问题是否还有任何价值。
谢谢!