奇怪的映射要求

时间:2012-06-17 20:37:58

标签: nhibernate fluent-nhibernate

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

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

1 个答案:

答案 0 :(得分:1)

对于第一条评论:自定义persiter或其他应该关注反向引用。

所以第一个映射还没有真正起作用?您可以在用户上映射虚拟反向引用并通过拦截器设置它,我可以根据需要发布内容。但是我几乎没有看到任何优势。

对于第二个:组和用户是两个聚合根。我想只根据他们的身份连接这两个AR。除了对方的身份证之外,这两个AR不需要任何其他信息。

// 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>;
相关问题