简体   繁体   English

流利的NHibernate自动映射为1个关系生成2个外键

[英]Fluent NHibernate Automappings generating 2 foreign keys for 1 relationship

I have this setup (condensed for brevity) 我有此设置(为简洁起见,简明扼要)

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

Class ChecklistItem
    virtual Employee InitialedBy { get; set; }

When this is generated I get these tables 当生成这个时,我得到这些表

Employee
    Id

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

The ChecklistItem has 2 foreign keys for Employee, I'm assuming Employee_id to map ChecklistItem.Employee and InitialedBy_id to map ChecklistItem.InitialedBy. ChecklistItem有2个用于Employee的外键,我假设Employee_id映射ChecklistItem.Employee,InitialedBy_id映射ChecklistItem.InitialedBy。 How can I tell NHibernate that this is the same bidirectional relationship and only requires 1 foreign key? 我怎样才能告诉NHibernate这是相同的双向关系,只需要1个外键?

I'm kind of new to NHibernate in general, but this seems like it should be pretty standard. 一般而言,我对NHibernate还是陌生的,但这似乎应该很标准。

This is what I've come up with when I'm configuring my database to generate the right schema, is it right? 这是我在配置数据库以生成正确的架构时想到的,对吗?

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

If that is right, is there a way to choose KeyColumn based on the ChecklistItem's property name (a lambda)? 如果是正确的话,是否可以根据ChecklistItem的属性名称(lambda)选择KeyColumn?

as a convention for all hasmanies 作为所有hasmanies的约定

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

or only for this 或仅为此

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");
    }
}

convention for Manytoone/References 多音/参考惯例

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM