Индивидуальное сопоставление с NHibernate / Использование сущности в качестве ПК - PullRequest
2 голосов
/ 13 июля 2009

У меня есть два теоретических предметных объекта:

человек публичного класса { public virtual int Id {get; приватный набор; } }

public class PersonMap : ClassMap<Person>
{
    public PersonMap() { Id( x => x.Id ); }
}

public class DriversLicense
{
    public virtual Person Person { get; set; }
    public virtual string State { get; set; }
}

public class DriversLicenseMap : ClassMap<DriversLicense>
{
    public DriversLicenseMap()
    {
        References( x => x.Person );
        Map( x => x.State );
    }
}

Где объект Person должен использоваться в качестве PK на DriversLicense. Я не хочу, чтобы объект Person обладал какими-либо знаниями о DriversLicense, поэтому связь поддерживается строго в классе DriversLicense. На одного человека предоставляется только один DriversLicense.

При такой настройке я получаю следующее исключение:

System.Xml.Schema.XmlSchemaValidationException: Элемент 'class' в пространстве имен 'urn: nhibernate-mapping-2.2' имеет недопустимый дочерний элемент 'свойство' в Пространство имен 'Урна: NHibernate-отображение-2,2'. Список ожидаемые возможные элементы: 'мета, jcs-кеш, кеш, идентификатор, составной идентификатор в Пространство имен 'Урна: NHibernate-отображение-2,2'

.

Добавление свойства Id к типу DriversLicense устраняет проблему.

Есть ли способ использовать самого Person в качестве первичного ключа в таблице DriversLicense, чтобы базовая таблица просто использовала Person.Id для своего первичного ключа?

Ответы [ 2 ]

1 голос
/ 14 июля 2009

@ Матье вывел меня на правильный путь с помощью составных ключей. Мне пришлось использовать метод UseCompositeId (), а затем переопределить Equals & GetHashCode для объекта «Лицензия водителя».

Вот как это выглядит в беглом NHibernate:

public class DriversLicense
{
        public virtual Person Person { get; set; }
        public virtual string State { get; set; }

        public override bool Equals( object obj )
        {
            if( ReferenceEquals( obj, null ) ) return false;

            // Cast, instead of 'as' throws runtime exception when obj is not an 
            // DriversLicense.
            var comp = (DriversLicense) obj;

            if( Person == null || comp.Person == null )
                return false;

            return Person.Equals( comp.Person );
        }

        public override int GetHashCode() 
        {
            return Account == null ? -1 : Account.GetHashCode(); 
        }
}

public class DriversLicenseMap : ClassMap<DriversLicense>
{
        public DriversLicenseMap()
        {
                UseCompositeId().WithKeyReference( x => x.Person );
                Map( x => x.State );
        }
}
1 голос
/ 13 июля 2009

Вы можете использовать составной идентификатор ключа? http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-compositeid http://nhibernate.info/doc/nh/en/index.html#components-compositeid

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