0

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() をセットアップする方法についてのアイデア。

4

1 に答える 1

1

HasOneまれな1対1の関係用です。References1 対多の関係の片側を宣言するために使用します。ドメイン モデルについていくつかの仮定を立てると、マッピングは次のようになります。

project.HasMany<ProjectRoles>(p=> p.Team).Inverse().Cascade.AllDeleteOrphan()
projectRole.References<Role>(r => r.Role);
projectRole.References<User>(r => r.User);

との違いについては、この質問も参照してください。HasOneReferences

于 2013-04-16T14:07:14.113 に答える