Свободное отображение NHibernate - составной ключ - PullRequest
2 голосов
/ 06 июля 2010

Я пытаюсь отобразить следующие таблицы / сущности в FNH и, похоже, быстро никуда не денется!

**Tables**
Contacts
    ID (PK - int - generated)
    ...

PhoneTypes
    ID (PK - varchar - assigned) (e.g. MOBILE, FAX)

ContactPhones
    ContactRefId    (PK - FK to Contacts)
    PhoneTypeRefId  (PK - FK to PhoneTypes)
    ...

(я должен отметить, что я также использую архитектуру S # arp Architecture)

**Entities**
public class Contact : Entity
{
    (The ID property is defined in the Entity base class and is type int)

    public virtual ICollection<ContactPhone> PhoneNumbers { get; set; }
}

public class PhoneType : EntityWithTypedId<string>, IHasAssignedId<string>
{
    (The ID property is defined in the base class and is type string)

    ....
}

public class ContactPhone : EntityWithTypedId<ContactPhoneId>, IHasAssignedId<ContactPhoneId>
{
    public virtual Contact Contact { get; set; }

    public virtual PhoneType PhoneType { get; set; }
    ....
}

Я прочитал, что при работе с составными идентификаторами рекомендуется разделять составной идентификатор на другой класс. составной ключ hibernate

public class ContactPhoneId : EntityWithTypedId<ContactPhoneId>, IHasAssignedId<ContactPhoneId>
{
    public virtual Contact Contact { get; set; }

    public virtual PhoneType PhoneType { get; set; }
}
...I could just make this class serializable and override 
Equals and GetHashCode myself instead of using the S#arp Arch base class.

Я перепробовал так много комбинаций сопоставлений, что теперь я совершенно сбит с толку.

Это мой последний снимок:

public class ContactMap : IAutoMappingOverride<Contact>
{
    public void Override(AutoMapping<Contact> mapping)
    {
        mapping.HasMany<ContactPhone>(x => x.PhoneNumbers)
            .KeyColumns.Add("ContactRefId")
            .KeyColumns.Add("PhoneTypeRefId")
            .AsSet()
            .Inverse()
            .Cascade.All();
    }
}


public class PhoneTypeMap : IAutoMappingOverride<PhoneType>
{
    public void Override(AutoMapping<PhoneType> mapping)
    {
        mapping.Id(x => x.Id).Column("Id").GeneratedBy.Assigned();
    }
}


public class ContactPhoneMap : IAutoMappingOverride<ContactPhone>
{
    public void Override(AutoMapping<ContactPhone> mapping)
    {
        mapping.Table("ContactPhones");
        mapping.CompositeId<ContactPhoneId>(x => x.Id)
            .KeyReference(y => y.Contact, "ContactRefId")
            .KeyReference(y => y.PhoneType, "PhoneTypeRefId");
    }
}  

У меня было много исключений при генерации отображений, самое последнее из которых:

Foreign key (FK672D91AE7F050F12:ContactPhones [ContactRefId, PhoneTypeRefId])) 
must have same number of columns as the referenced primary key (Contacts [Id])

Кто-нибудь видит что-нибудь очевидное, что я делаю неправильно?Я новичок в NH и FNH, что может быть очевидно из этого поста.:-) Кроме того, кто-нибудь использовал составные идентификаторы, подобные этому, при использовании S # arp Architecture?Каковы лучшие практики (кроме использования суррогатных ключей :-))?

Большое спасибо ... и извините за длинный пост.

Ответы [ 2 ]

0 голосов
/ 07 июля 2010

Возможно, FluentNHibernate не может отобразить эти отношения. Вы можете попробовать сделать это, используя файлы hbm. Примеры в этой статье не совсем совпадают с вашей ситуацией, но этого может быть достаточно, чтобы начать работу.

Свободный NHibernate: Как отобразить M: N многие-ко-многим с составными ключами с обеих сторон

0 голосов
/ 06 июля 2010

У меня тоже есть отношения многие ко многим.У меня есть мои настройки так:

mapping.HasManyToMany(x => x.Artists).Cascade.All().Inverse().Table("ArtistImages");

Таблица ArtistImages имеет первичные ключи для таблиц Artists и Images.

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