2

Я пытаюсь отобразить следующие таблицы/сущности в FNH и, кажется, быстро не достигает!Fluent NHibernate Mapping - Composite Key

**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 # агр Архитектуры)

**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 composite key

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, что может быть очевидно из этого поста. :-) Кроме того, кто-нибудь использовал Composite Ids, как это, используя S # arp Architecture? Каковы лучшие практики (кроме использования суррогатных ключей :-))?

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

ответ

0

У меня есть много разных отношений. У меня есть установка шахты, как это:

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

В таблице ArtistImages есть первичные ключи для таблиц художников и изображений.

0

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

Fluent NHibernate: How to Map M:N many-to-many with composite keys on both sides

Смежные вопросы