使用NHibernate自动更新一对多关系的两端

时间:2010-07-15 12:04:32

标签: .net nhibernate fluent-nhibernate

这是一个新问题,所以提前抱歉。

我正在使用流畅的NHibernate并在其上获得一个奇怪的行为。

我有两个看起来像这样的类(简化):

public class Group
{
    public virtual int Id{get;protected set;}
    public virtual String Name{get;set;}
    public virtual List<Person> Persons {get; protected set;}
}

public class Person
{
    public virtual int Id{get;protected set;}
    public virtual String Name{get;set}
    public virtual Group Group {get;set;}
}

和映射 组:

Id(x=>x.Id)
Map(x=>x.Name)
HasMany(x=>x.Persons).Cascade.All.Inverse()

人:

Id(x=>x.Id)
Map(x=>x.Name)
References(x=>x.Group)

现在,在我的代码中,我想将一个人移动到另一个组。因为这是一种关系,我以为我可以简单地做到

myPerson.Group = anotherGroup;
_mySession.SaveOrUpdate(myPerson);
_mySession.Flush()

如果我这样做,数据库会正确更新,但如果我试图查看对象“anotherGroup”的人员列表,我看不到对象“myPerson”,这仍然是旧组的人员列表。

那么,有没有办法让NH重新加载列表,或者让它一直更新。

我现在找到的唯一解决方法是:

myPerson.Group.Persons.Remove(myPerson);
anotherGroup.Persons.Add(myPerson);
myPerson.Group = anotherGroup;
_mySession.Flush()

但我发现它有点脏......

对我做错了什么的任何想法?谢谢!

2 个答案:

答案 0 :(得分:3)

使用辅助方法来简化这一过程;在小组你想要的东西:

RemovePerson(person)
AddPerson(person)

您可能会发现本文对其他指南很有帮助:Strengthening your domain: Encapsulated collections

答案 1 :(得分:2)

@Gimly L2S中的关系是自动的,因为它使用自定义集合(NHibernate与标准接口一起使用,并且可以在实例化之后将其保存为集合,例如,List)。然而,有一些关于如何改进的非正式谈话,但没有任何内容,因为它具有非常低的优先级,因为简单的解决方法(上面的答案)