Родительский ключ иерархического объекта в NHibernate ByCode - PullRequest
0 голосов
/ 23 января 2012

Используя конфигурацию NHibernate 3.2 ByCode, я пытаюсь отобразить следующую иерархическую сущность:

public class BusinessType
{
    public virtual Guid BusinessTypeId { get; set; }
    public virtual Guid? ParentBusinessTypeId { get; set; }
    public virtual String BusinessTypeName { get; set; }
    public virtual ICollection<BusinessType> Children { get; set; }
}

с этим ClassMapping:

public class BusinessTypeMapper : ClassMapping<BusinessType>
{
    public BusinessTypeMapper()
    {
        Id(x => x.BusinessTypeId, x => x.Type(new GuidType()));
        Property(x => x.ParentBusinessTypeId, x => x.Type(new GuidType()));
        Property(x => x.BusinessTypeName);
        Set(x => x.Children,
            cm =>
                {
                    // This works, but there is an ugly string in here
                    cm.Key(y => y.Column("ParentBusinessTypeId"));
                    cm.Inverse(true);
                    cm.OrderBy(bt => bt.BusinessTypeName);
                    cm.Lazy(CollectionLazy.NoLazy);
                },
            m => m.OneToMany());
    }
}

Это работает нормально, но я бы предпочел указать ключ отношения, используя лямбду, чтобы рефакторинг работал. Похоже, это доступно следующим образом:

public class BusinessTypeMapper : ClassMapping<BusinessType>
{
    public BusinessTypeMapper()
    {
        Id(x => x.BusinessTypeId, x => x.Type(new GuidType()));
        Property(x => x.ParentBusinessTypeId, x => x.Type(new GuidType()));
        Property(x => x.BusinessTypeName);
        Set(x => x.Children,
            cm =>
                {
                    // This compiles and runs, but generates some other column
                    cm.Key(y => y.PropertyRef(bt => bt.ParentBusinessTypeId));
                    cm.Inverse(true);
                    cm.OrderBy(bt => bt.BusinessTypeName);
                    cm.Lazy(CollectionLazy.NoLazy);
                },
            m => m.OneToMany());
    }
}

Проблема в том, что это заставляет NHibernate генерировать столбец с именем businesstype_key, игнорируя уже настроенный ParentBusinessTypeId. Есть ли способ заставить NHibernate использовать лямбду для указания отношения, а не строку?

1 Ответ

1 голос
/ 23 января 2012

Мне никогда не нужно переходить от детей к родителям, только от родителей детям, поэтому я не думал, что это необходимо

затем удалите public virtual Guid? ParentBusinessTypeId { get; set; } полностью. Тогда NH создаст только «businesstype_key» (соглашение), но не «ParentBusinessTypeId». если вы хотите изменить это, вам нужно указать предпочитаемое имя столбца с cm.Key(y => y.Column("yourpreferredColumnName"));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...