0

我有两个类和集合的映射:

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 或其他东西应该注意反向引用。

所以第一个映射实际上已经不起作用了吗?您可以在 User 上映射虚拟反向引用并通过拦截器进行设置,如果需要,我可以发布一些内容。但是我几乎看不到任何优势。

对于第二个:组和用户是两个聚合根。我只想通过他们的身份来连接这两个 AR。两个 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 回答