Свободные автоматические сопоставления NHibernate, генерирующие 2 внешних ключа для 1 отношения - PullRequest
0 голосов
/ 22 сентября 2011

У меня есть эта настройка (сокращенно для краткости)

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

Если это правильно, есть ли способ выбрать KeyColumn на основе имени свойства ChecklistItem (лямбда)?

1 Ответ

0 голосов
/ 22 сентября 2011

как соглашение для всех хамманов

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 / Список литературы

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