流畅的NHibernate Automappings为1个关系生成2个外键

时间:2011-09-22 13:46:15

标签: c# fluent-nhibernate automapping

我有这个设置(为了简洁而简化)

Class Employee
    virtual IList<ChecklistItem> HasInitialed { get; private set; }

Class ChecklistItem
    virtual Employee InitialedBy { get; set; }

当这个生成时,我得到这些表

Employee
    Id

ChecklistItem
    Id
    InitialedBy_id <----
    Employee_id <----

ChecklistItem有2个Employee外键,我假设Employee_id映射ChecklistItem.Employee和InitialedBy_id来映射ChecklistItem.InitialedBy。我如何告诉NHibernate这是双向关系相同,只需要1个外键?

我对NHibernate一般都很陌生,但这似乎应该是非常标准的。

这是我在配置数据库以生成正确的架构时所提出的,是不是?

.Override<Employee>(map => map
    .HasMany<ChecklistItem>(x => x.HasInitialed)
    .KeyColumn("InitialedBy_id"))

如果这是正确的,有没有办法根据ChecklistItem的属性名称(lambda)选择KeyColumn?

1 个答案:

答案 0 :(得分:0)

作为所有hasmanies的惯例

class HasManyConvention : IHasManyConvention
{
    public void Apply(IOneToManyCollectionInstance instance)
    {
        instance.Key.Column(((ICollectionInspector)instance).Name + "_id");
    }
}

或仅适用于此

class HasManyConvention : IHasManyConvention, IHasManyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IOneToManyCollectionInspector> criteria)
    {
        criteria.Expect(x => x.Name == "HasInitialed"); // and/or entity type
    }

    public void Apply(IOneToManyCollectionInstance instance)
    {
        instance.Key.Column(((ICollectionInspector)instance).Name + "_id");
    }
}

Manytoone / References的惯例

class ReferenceConvention : IReferenceConvention
{
    public void Apply(IManyToOneInstance instance)
    {
        instance.Column(instance.Name + "_id");
    }
}