我有两个类和集合的映射:
class User
{
Guid ID;
string Name;
}
class Group
{
Guid ID;
string Name;
IList<User> Members;
}
// GroupMap
HasMany(x=>x.Members).Inverse().Cascade.AllDeleteOrhpan().etc.
这个有效。当我将一个User添加到Members集合时,NHibernate会对该操作进行级联操作。删除和更新也是如此。
现在我想稍微更改我的模型,这也将改变映射。该集合是IList <Guid
&gt;。我真正想要的是保留的级联。这意味着我必须做一些自定义持久性或IUserType。映射应该告诉对象类型,如HasMany(x =&gt; 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
答案 0 :(得分:1)
对于第一条评论:自定义persiter或其他应该关注反向引用。
所以第一个映射还没有真正起作用?您可以在用户上映射虚拟反向引用并通过拦截器设置它,我可以根据需要发布内容。但是我几乎没有看到任何优势。
对于第二个:组和用户是两个聚合根。我想只根据他们的身份连接这两个AR。除了对方的身份证之外,这两个AR不需要任何其他信息。
// readonly mapping
HasMany(x => x.Members).Column("Group_Id").Element("Id").Readonly();
我认为当你有一个指向用户的非只读guid集合时,你会遇到许多微妙的问题。例如,应该为:
生成什么sqlvar 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>;