引用符
データのマッピングに ByCode メソッドを使用しています。
各ステップに割り当てられた ProcessStepUser (ProcessStepUser テーブル) オブジェクトの Bag を持つ ProcessStep (ProcessStep テーブル) オブジェクトのリストを持つ Process (Process テーブル) オブジェクトがあります。
オブジェクトは正常に読み込まれますが、Web ページでコレクションから Step を削除し、プロセスとして MVC アクションに再水和してプロセスを保存すると、データベース内の Step の ProcessId が null に設定され、リンクが切断されます。ただし、ステップはデータベースとそれに割り当てられたすべてのユーザーに残されます。
私ができるようにしたいのは、ステップを削除し、その ProcessStep とそのすべての ProcessStepUsers を削除することです。
同様に、ProcessStep を編集して (たとえば、ステップの名前を変更して) 保存すると、それは保存されますが、ProcessStep ユーザーは (ProcessStepId から) 無効になり、再作成され、孤立したレコードが残ります。
ProcessId 全体の ProcessStepUser にも列があるため、ユーザーがプロセスのどのステップにも複数回割り当てられるのを防ぐことができます。
私の関連するマッピングは次のとおりです。
プロセス:
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));
});
先ほど言ったように、作成時に問題なく保存され、表示用に問題なくロードされます。しかし、ステップのドロップまたはステップの編集は、データベースに大混乱を引き起こしています。
プロセスマスターオブジェクトを保存する前にフラグを立てて手動で削除することで、ステップ削除プロセスをハッキングしましたが、可能であれば、nhibernate にすべて実行してもらいたいです。
ありがとう!
引用符
最初に、Cascade.All.Include(Cascade.DeleteOrphans) で 1 つの問題を見つけた Martin に感謝します... それは私が持っていた元のコードでした。
いくつかのテストを書き直しましたが、マッピングは実際には問題なく機能しています。私はこの質問を削除しますが、サイトでは (Firefox で) 編集することしかできません...
問題は、データベースから Process オブジェクトを取得し、それを JSON オブジェクトとして View にシリアル化していたためです。次に、Process オブジェクトにバインドされた JSON オブジェクトを返しました。
要するに、私たちのリポジトリはオブジェクトに対して SaveOrUpdate(obj) を呼び出していましたが、接続が切断されていたため、Merge(obj) を呼び出す必要があり、実行して完全に機能しました。
この質問に価値があるかどうかは、権力者に委ねます。
ありがとう!