0

コレクションには 2 つのクラスとマッピングがあります。

class User
{
    Guid ID;
    string Name;
}

class Group
{
    Guid ID;
    string Name;
    IList<User> Members;
}

// GroupMap
HasMany(x=>x.Members).Inverse().Cascade.AllDeleteOrhpan().etc.

これは機能します。ユーザーをメンバー コレクションに追加すると、NHibernate は操作をカスケードします。削除と更新についても同様です。

ここで、モデルを少し変更したいと思います。これにより、マッピングも変更されます。コレクションは IList <Guid> です。私が本当に望んでいるのは、カスケードが残っていることです。つまり、カスタムの永続化または IUserType を実行する必要があります。マッピングは、HasMany(x=>x.Members) のようなオブジェクト タイプを伝える必要があり、コレクションは ID を保持します。

class User
{
    Guid ID;
    string Name;
}

class Group
{
    Guid ID;
    string Name;
    IList<Guid> Members;
}

// GroupMap
HasMany<User>(x=>x.Members).Inverse().Cascade.AllDeleteOrhpan().etc.

どこから始めればいいですか?すぐに使えるソリューションはないと思いますが、誰が知っていますか...

PS: NHib ユーザー グループ: https://groups.google.com/forum/#!topic/nhusers/pSUOaGxdxVM

4

1 に答える 1

1

最初のコメントについて: カスタム persiter または他の何かが後方参照に注意する必要があります。

最初のマッピングは実際にはまだ機能していませんか? ユーザーに仮想後方参照をマップし、インターセプターを介して設定できます。必要に応じて何かを投稿できます。しかし、私はほとんど利点がありません。

2 つ目: Group と User は 2 つの集約ルートです。2 つの AR を ID だけで結び付けたい。2 つの AR には、相手の ID 以外の情報は必要ありません。

// readonly mapping
HasMany(x => x.Members).Column("Group_Id").Element("Id").Readonly();

ユーザーを指す読み取り専用ではない GUID のコレクションがある場合、多くの微妙な問題に遭遇すると思います。たとえば、どのSQLを生成する必要があります:

var user = new User { Id = Guid.New(), Name = "Joe", Age = 12 };
group.Members.Add(user.Id);

session.SaveOrUpdate(group);
session.Flush();

a) INSERT INTO Users (Id, Group_id) Values(...);
b) nothing
c) INSERT INTO Users (Id, Group_id, Name, Age) Values(...);

またはこれ

group.Members.Remove(someGuid);

session.SaveOrUpdate(group);
session.Flush();

a) DELETE FROM Users WHERE group_id = 1;
b) DELETE FROM Users WHERE id = <guid>;
c) Update Users Set group_id = null WHERE Id = <guid>;
于 2012-06-24T18:34:35.867 に答える