2009-07-13 4 views
2

У меня есть два теоретических объекты домена:Один-к-одному с NHibernate/Использование Entity как ПК

общественный класс Person { публичных виртуальный ИНТ Id {получить; частный набор; }}

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

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

Когда установка таким образом я получаю следующее исключение:

System.Xml.Schema.XmlSchemaValidationException: Элемент 'класс' в пространстве имен 'урна: NHibernate-отображение-2,2' имеет недействительный дочерний элемент 'property' в namespace 'urn: nhibernate-mapping-2.2'. Список ожидаемых элементов: 'meta, jcs-cache, cache, id, composite-id' in namespace 'urn: nhibernate-mapping-2.2'.

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

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

ответ

1

@Matthieu меня на правильном пути с составными ключами. Мне пришлось использовать метод UseCompositeId(), а затем переопределить Equals & GetHashCode для объекта License License.

Вот как это выглядит в Fluent 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); 
     } 
} 
Смежные вопросы