0

Я новичок в Fluent NHibernate, и у меня есть проблема с определенным отношением HasMany.Ошибка Fluid NHibernate: должно иметь такое же количество столбцов, что и ссылочный первичный ключ

У меня есть три объекта: User, Company и CompanyAddress

User ссылки Company правильно и Company бы ссылающихся CompanyAddress (но это не получится).

Company отображение состоит как следующее:

public class CompanyMap : ClassMap<Company> 
{ 
    public CompanyMap() 
    { 
     Schema("company"); 
     Table("LIST"); 

     this.CompositeId(x => x.key) 
      .KeyProperty(x => x.applicationId, "APPLICATION_ID") 
      .KeyProperty(x => x.id, "ID") 
      .KeyProperty(x => x.userId, "USER_ID"); 

     this.Map(x => x.vat, "VAT"); 

     this.HasMany(x => x.addresses) 
      .Not.LazyLoad() 
      .Cascade.None(); 

     this.References(x => x.user) 
      .Class<User>() 
      .Columns("APPLICATION_ID", "USER_ID") 
      .Insert() 
      .Update() 
      .Fetch.Select() 
      .Not.LazyLoad() 
      .Cascade.None(); 
    } 
} 

и CompanyAddress является:

public class CompanyAddressMap : ClassMap<CompanyAddress> 
{ 
    public CompanyAddressMap() 
    { 
     Schema("[address]"); 
     Table("COMPANY_LIST"); 

     this.CompositeId(x => x.key) 
      .KeyProperty(x => x.applicationId, "APPLICATION_ID") 
      .KeyProperty(x => x.id, "ID") 
      .KeyProperty(x => x.entityId, "COMPANY_ID"); 

     this.Map(x => x.country, "COUNTRY"); 
     this.Map(x => x.province, "PROVINCE"); 
     this.Map(x => x.region, "REGION"); 
     this.Map(x => x.city, "CITY"); 
     this.Map(x => x.address, "[ADDRESS]"); 
     this.Map(x => x.description, "DESCRIPTION"); 

     this.References(x => x.company) 
      .Class<Company>() 
      .Columns("APPLICATION_ID", "COMPANY_ID") 
      .Insert() 
      .Update() 
      .Fetch.Select() 
      .Not.LazyLoad() 
      .Cascade.None(); 
    } 
} 

, но я получаю эту ошибку:

Foreign key (FK8DE1BC098F20893F:COMPANY_LIST [APPLICATION_ID, COMPANY_ID])) must have same number of columns as the referenced primary key (LIST [APPLICATION_ID, ID, USER_ID])

Мне нужно ссылаться AddressCompany с несырьевых потому что Company уже ссылается User, и поэтому мой вопрос:

Как я могу ссылаться на этот внешний ключ с использованием Fluent NHibernate без изменения реального внешнего ключа, определенного в базе данных?

[EDIT]

i need to reference AddressCompany with non the primary key 'cause Company is already referenced by User and so my question is: how can i reference this foreign key using fluent nhibernate without modifying the real foreign key defined into the database?

я не хочу, чтобы добавить User_ID поле в [адрес]. [COMPANY_LIST] стол и я не хочу, чтобы добавить поля идента в AddressCompany класс ... причина бесполезное поле ... отношения являются:

user.LIST
ApplicationID (рк)
идентификатора (рк)

company.LIST
ApplicationID (рк) (FK -> user.LIST (ApplicationID))
идентификатор (рк)
идентификатор пользователя (рк) (FK -> user.LIST (ID))

address.COMPANY_LIST
ApplicationID (рк) (Ф.К. -> company.LIST (ApplicationID))
идентификатор (рк)
CompanyID (рк) (Ф.К. -> company.LIST (идентификатор))

почему nhibe rnate хочет заставить меня ссылаться только на точный первичный ключ?
Могу ли я обратиться к подмножеству первичного ключа класса компании?

большое спасибо ...

ответ

0

ошибка кажется довольно самоочевидный от вашего отображения и сообщений об ошибках

Foreign key (FK8DE1BC098F20893F:COMPANY_LIST [APPLICATION_ID, COMPANY_ID])) must have same number of columns as the referenced primary key (LIST [APPLICATION_ID, ID, USER_ID])

Вы отображение для CompanyMap отображает ваш первичный ключ для как три колонка

this.CompositeId(x => x.key) 
     .KeyProperty(x => x.applicationId, "APPLICATION_ID") 
     .KeyProperty(x => x.id, "ID") 
     .KeyProperty(x => x.userId, "USER_ID"); 

, но ваши ссылки на компанию в CompanyAddressMap только карты обратно в компанию с 2 колонками

this.References(x => x.company) 
     .Class<Company>() 
     .Columns("APPLICATION_ID", "COMPANY_ID") 
     .Insert() 
     .Update() 
     .Fetch.Select() 
     .Not.LazyLoad() 
     .Cascade.None(); 

Добавьте столбец идентификатора в список столбцов.

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

  • Нет связанных вопросов^_^