FluentNHibernate:相同实体之间的多个一对多关系

时间:2010-05-05 22:13:19

标签: .net asp.net nhibernate fluent-nhibernate nhibernate-mapping

我正在开发一个错误跟踪应用程序。有票证,每张票证都有一个开场用户和一个分配的用户。所以,基本上,我有两个实体,它们之间有两个多对一的关系。他们的原理图如下:

用户:

public class User
{
    public virtual int Id { get; protected set; }
    ...

    public virtual IList<Ticket> OpenedTickets { get; set; }
    public virtual IList<Ticket> AssignedTickets { get; set; }
}

票:

public class Ticket
{
    public virtual int Id { get; protected set; }
    ...

    [Required]
    public virtual User OpenerUser { get; set; }
    public virtual User AssignedUser { get; set; }
}

我使用FluentNHibernate的自动映射功能。

问题是,无论我设置的关系是否在用户一侧,两个集合总是包含相同的数据。我猜Fluent无法分辨出哪个关系属于哪个。

我用Google搜索,但没有找到任何有用的东西。

编辑2:

在Steves的帮助下,我必须实施自己的IHasManyConvention。我还发现IHasManyConvention中生成的列名必须与我的IReferenceConvention生成的列名相匹配。随着一个小小的调整,我得到了它的工作。

我还惊讶地发现,调用方便的ForeignKey.EndsWith("Id")方法会弄乱整个事情。

虽然史蒂夫斯的答案本身并没有解决问题,但我非常感谢他指出了我正确的方向。

1 个答案:

答案 0 :(得分:2)

自动映射为其外键列生成相同的名称。您可以使用通过(映射)属性名称命名外键列的自定义约定来解决此问题:

class HasManyConvention : IHasManyConvention
{
    public void Apply(IOneToManyCollectionInstance instance)
    {
        instance.Key.Column(instance.Member.Name);
    }
}

// register convention using:
autoMapping.Conventions.Add(new HasManyConvention());