C# Fluent NHibernate具有指定关系类型的鉴别器列的多个属性

C# Fluent NHibernate具有指定关系类型的鉴别器列的多个属性,c#,nhibernate,fluent-nhibernate,nhibernate-mapping,fluent-nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Fluent Nhibernate Mapping,我正在使用Fluent-NHibernate,并试图映射一个简单地绕过联接表的多对多属性。棘手的是,联接表有一列确定它是什么类型的关系 对于这个问题,假设我有一个人表和一个关系表 PersonTable (PersonId, Name, etc) RelationTable (RelationType, PersonIdA, PersonIdB) 我想为每种类型的关系(例如儿子、女儿等)引入一个Person类集合属性 HasManyToMany<Person>(x => x.

我正在使用Fluent-NHibernate,并试图映射一个简单地绕过联接表的多对多属性。棘手的是,联接表有一列确定它是什么类型的关系

对于这个问题,假设我有一个人表和一个关系表

PersonTable (PersonId, Name, etc)
RelationTable (RelationType, PersonIdA, PersonIdB)
我想为每种类型的关系(例如儿子、女儿等)引入一个Person类集合属性

HasManyToMany<Person>(x => x.Sons)
    .Table("RelationTable")
    .ParentKeyColumn("PersonIdA")
    .ChildKeyColumn("PersonIdB")
    .Where("RelationType='A_IS_FATHER_OF_B_BOY'");

HasManyToMany<Person>(x => x.Daughters)
    .Table("RelationTable")
    .ParentKeyColumn("PersonIdA")
    .ChildKeyColumn("PersonIdB")
    .Where("RelationType='A_IS_FATHER_OF_B_GIRL'");
基本上,当在关系表中将杰克保存为约翰的新儿子时,我需要在RelationType中填充“A_IS_FATHER_OF_B_BOY”,这在目前还没有发生。 指令.Where(“RelationType='A_是'u B_BOY'的父亲'”)仅对加载有效,而对保存无效

有什么想法吗?我认为这有点类似于子类的Discriminator属性


谢谢你的帮助。谢谢。

我想说,正如你在评论中指出的那样:

实际上,我确实使用2对Person(作为PersonA和PersonB)的多对一引用映射了RelationTable。使用
一对多
(HasMany),考虑到上述鉴别器值,您建议我如何在Person类中映射儿子和女儿(都是
列表

所以我眼中的配对对象是

public class PersonRelation
{
    // the pairing table must contain the key column, surrogated ID
    public virtual int Id { get; protected set; } // this is a must. 

    public virtual Person Parent { get; set; }
    public virtual Person Child { get; set; }
    public virtual string RelationType { get; set; }
}
这张桌子一定有钥匙。只需在SQL Server中插入一些标识列即可。。但是有一些具有代理(业务领域独立)密钥

这是我们的个人实体

public class Person
{
    IList<PersonRelation> _sons;
    IList<PersonRelation> _daughters;
    ..,
    public virtual IList<PersonRelation> Sons 
    {
        get { return _sons ?? (_sons = new List<PersonRelation>()); }
        set { _sons = value; }
    }
    public virtual IList<PersonRelation> Daughters
    {
        get { return _daughters?? (_daughters= new List<PersonRelation>()); }
        set { _daughters= value; }
    }
}
这必须是业务层AddSon()的一部分,也可以是POCO公共方法

注:我们还可以映射该关系的反向端。。。即使没有relationType筛选:

public class Person
{
    ... as above
    public virtual IList<PersonRelation> Parents { get; set; }


HasMany<PersonRelation>(x => x.Parents)
    // instead of this
    // .KeyColumn("PersonIdA")
    // we need this column
    .KeyColumn("PersonIdB")
;
公共类人物
{
…如上所述
公共虚拟IList父项{get;set;}
有很多(x=>x个父母)
//而不是这个
//.KeyColumn(“PersonIdA”)
//我们需要这个专栏
.KeyColumn(“PersonIdB”)
;

在您得到答案之前,我建议尽可能避免多对多。如果您喜欢阅读更多或@RadimKöhler,我已经阅读了您提供的链接。我确实将RelationTable映射为2个多对一引用到Person(如Person和PersonB)。使用一对多(HasMany),那么您建议我如何在考虑上述鉴别器值的情况下映射Person类中的儿子和女儿(两个列表)?谢谢。
HasMany<PersonRelation>(x => x.Sons)
    // .Table("RelationTable") // not needed - part of PersonRleation mapping
    .KeyColumn("PersonIdA")
    .Where("RelationType='A_IS_FATHER_OF_B_BOY'")
    .Inverse()
    .Cascade.AllDeleteOrphan() 
;
var parent = ...; // new, loaded
var child  = ...; // new, loaded

var relation = new PersonRelation
{
    Parent = parent;
    Child  = child;
    RelationType = "A_IS_FATHER_OF_B_BOY";
};

parnet.Sons.Add(relation);
public class Person
{
    ... as above
    public virtual IList<PersonRelation> Parents { get; set; }


HasMany<PersonRelation>(x => x.Parents)
    // instead of this
    // .KeyColumn("PersonIdA")
    // we need this column
    .KeyColumn("PersonIdB")
;