2012-05-17 2 views
3

Я получаю следующее сообщение об ошибке:Не удается разрешить свойство: Id

NHibernate.HibernateException: NHibernate.HibernateException: Unable to resolve property: Id. 

Эта ошибка возникает из следующей строки кода:

User userFound = session.QueryOver<User>() 
        .Where(x => x.Id == testObjects.TestUser.Id) 
        .SingleOrDefault(); 

Мои сокращенных отображений следующим образом:

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Table("USER_HEADER"); 
     Id(x => x.Id, "USER_ID") 
      .GeneratedBy.Foreign("UserLocation"); 

     HasOne(x => x.UserLocation) 
      .PropertyRef(x => x.Id) 
      .Cascade.All(); 
    } 
} 

public class LocationMap : ClassMap<Location> 
{ 
    public LocationMap() 
    { 
     Table("LOC_HEADER"); 
     Id(x => x.Id, "LOC_ID"); 

     HasOne(x => x.User) 
      .PropertyRef(x => x.Id); 
    } 
} 

Я был в состоянии запросить объект пользователя, прежде чем я добавил эту связь, чтобы Location так что я знаю это как-то связано с этим, но я не уверен, что именно. Я могу успешно создать объект User, привязанный к Location, но не могу запросить его. Использование ISession.Get создает ту же ошибку, что и вышеуказанный оператор QueryOver.

Ниже общий тест блок я бегу, что не удается:

public void Can_Create_User() 
    { 
     using (NHibernate.ISession session = SessionFactory.GetCurrentSession()) 
     { 
      using (NHibernate.ITransaction tran = session.BeginTransaction()) 
      { 
       session.Save(testObjects.TestValidationDetail); 
       session.Save(testObjects.TestUser); 
       tran.Commit(); 
      } 
     } 

     using (NHibernate.ISession session = SessionFactory.GetCurrentSession()) 
     { 
      User userFound = session.QueryOver<User>().Where(x => x.Id == testObjects.TestUser.Id).SingleOrDefault(); 

      Assert.IsNotNull(userFound); 
      Assert.AreEqual(userFound.Id, userFound.UserLocation.Id); 
     } 
    } 

ответ

5

Оказывается, это было вызвано мной неправильно используя PropertyRef. В моем случае мне не нужно было использовать это. Ошибка генерировалась, потому что не было свойства с именем Id, но был ID с именем Id. Я исправил мои проблемы, изменив свои отображения на:

HasOne(x => x.UserLocation) 
     .PropertyRef(x => x.Id) 
     .Cascade.All(); 

в

HasOne(x => x.UserLocation) 
     .Cascade.All(); 

и

HasOne(x => x.User) 
     .PropertyRef(x => x.Id); 

в

HasOne(x => x.User) 
+0

В моем случае я предполагал, что удаленная ссылка не является основным ключом - в основном то же самое. Спасибо за сообщение! – Jonno

+0

Да, это сработало для меня тоже, я использовал генератор карт Nhibernate, и он сгенерировал отображение в качестве ссылок на свойства, когда это не было необходимо, потому что Property на самом деле является идентификатором. – Daniel

2

PropertyRef maps to property-ref - устаревшая функция, она предназначена для создания ассоциаций «много-к-одному», когда ассоциация не выполняется на первичный ключ ассоциации.

Я предполагаю, что вы хотите указать, какое свойство должно быть создано, и поэтому вы использовали PropertyRef .., если вы используете соглашение по умолчанию Nhibernates в сопоставлении для Id of UserLocation, вам не нужно явно указывать свойство .. если вы явно указываете имя столбца, тогда вам нужно сделать то же самое здесь, но в этом случае вам нужно указать точное имя столбца.

Надеюсь, что это поможет.

+0

Я сразу ответил на свой вопрос ниже, столкнувшись с этой проблемой. Я думал, что мне нужно свойство ref, потому что первичными ключами между таблицами были разные имена (loc_id и user_id), но на самом деле один и тот же идентификатор. Это не предназначено для функции 'property-ref', как я узнал. –

+0

Я не видел вашего ответа на вопрос .. использовал приложение IPAD – Baz1nga

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