流畅的NHibernate客观化关系映射

时间:2009-03-10 08:05:41

标签: nhibernate fluent-nhibernate nhibernate-mapping many-to-many

寻找有关如何配置NHibernate以支持我的场景的答案,这是一个具有客观化关系的多对多地图。

我收集了与其他人有关系的人:s。每个关系都有一个属性,指定它们具有哪种关系。在RDB中,这是通过使用具有该表中指定的关系类型的多对多表来完成的,然后可以通过允许更多类型来扩展模型,例如, “亲密朋友”和“敌人”。

我希望能够查询Person对象以按类型

返回所有相关人员
<IList>Person myEnemies =  myPerson.getRelatedPersons(relationType.Enemy)

<IList>Person myFriends = myPerson.getRelatedPersons(relationType.Friend)

另一个(不太可扩展的)解决方案是在类中静态指定存在的其他关系:

public class Person   
{   
  public virtual int Id { get; private set; }   
  public virtual string FirstName { get; set; }   
  public virtual string LastName { get; set; }   
  public virtual IList<Person> Friends { get; set; }   
  public virtual IList<Person> Enemies { get; set; }   
}

现在我必须使用遗留数据库和“Person”表以及“PersonPerson”表。 “PersonPerson”表将关系类型保存为整数。

我尝试使用下面的语法来做到这一点,但到目前为止没有成功......

// How to specify type=1  here?
HasManyToMany(x => x.Friends).WithTableName("Person_Person"); 

// How to specify type=2  here?
HasManyToMany(x => x.Enemies).WithTableName("Person_Person"); 

使用(流畅的)NHibernate进行映射的任何提示/解决方案?

BR

/延

1 个答案:

答案 0 :(得分:1)

你说的第一个例子听起来像你需要调查一个继承映射,但我不确定这对于所涉及的额外表是如何工作的。

第二个例子你应该能够使用Where子句。

HasManyToMany(x => x.Friends)
  .WithTableName("Person_Person")
  .Where("type = 2");