Cascade.None() が有効になっているエンティティの 1 つに対して、Nhibernate が HasOne リレーションシップを保持することに問題があります。私のドメイン モデルには、以下に示す 4 つのクラスが含まれます。
public class Project
{
public virtual int Id {get;set;}
public virtual IList<ProjectRole> Team { get; protected set; }
}
public class ProjectRole
{
public virtual int Id { get; set; }
public virtual User User { get; set; }
public virtual Role Role { get; set; }
}
public class Role
{
public virtual int Id { get; set; }
public virtual string Value { get; set; }
}
public class User
{
public virtual int Id { get; protected set; }
public virtual string LoginName { get; set; }
}
つまり、基本的に、Team プロパティから利用可能な ProjectRoles のリストを持つプロジェクトがあります。各 ProjectRole は、そのプロジェクトでユーザーが果たす特定のロールにユーザーをリンクします。
これらのエンティティに対して次のカスケード関係を設定しようとしています。
project.HasMany<ProjectRoles>(p=> p.Team).Cascade.All()
projectRole.HasOne<Role>(r => r.Role).Cascade.None()
projectRole.HasOne<User>(r => r.User).Cascade.SaveUpdate()
上記のように流暢な nhibernate オーバーライドを使用してカスケードをセットアップしましたが、次の行が見つかりました
projectRole.HasOne<Role>(r => r.Role).Cascade.None()
ProjectRole.Role プロパティがデータベースに保存されません。これは、Nhibernate によって生成された SQL を見て診断したところ、ProjectRoles テーブルの "Role_id" 列が更新または挿入時に設定されていないことがわかります。
私も使ってみました
projectRole.HasOne<Role>(r => r.Role).Cascade.SaveUpdate()
しかし、それも失敗します。残念ながら、Cascade.All() をそのままにしておくと、プロジェクト ロールを削除しようとするとシステムが Role オブジェクトを削除することになるため、オプションではありません。
永続性を壊さずに ProjectRole-> Role 関係に Cascade.None() をセットアップする方法についてのアイデア。