2015-07-29 2 views
4

Допустим, мы имеем следующую модель:FirstOrDefault возвращает нуль на внешний ключ

public class ReadingOrder 
{ 
    public virtual int Id { get; set; } 
    public virtual Order Order { get; set; } 
} 

Mapping:

Table("db_ReadingOrder"); 
Id(o => o.Id).Column("Id").GeneratedBy.Identity(); 
References(o => o.Order, "OrderId"); 

Я хочу, чтобы получить ReadingOrder, который имеет orderId равный с 1 (например). Но когда я пытаюсь FirstOrDefault, запрос возвращает нуль:

var readingO = _repositoryFactory.GetRepository<ReadingOrder>().FirstOrDefault(xz => xz.Order.Id == 1); 

Если я получаю все из них, и после того, как капните FirstOrDefault работает, но его глупо:

var readingOrderList1 = _repositoryFactory.GetRepository<ReadingOrder>() 
         .GetAll().FirstOrDefault(xz => xz.Order.Id == 1); 

метод из репозитория имеет следующий формат:

public T FirstOrDefault(Expression<Func<T, bool>> predicate) 
{ 
    return _session.Query<T>().FirstOrDefault(predicate); 
} 

простой материал, но не работает. Если я пойду за нормальным свойством, например Id, все будет работать так, как ожидалось. Кроме того, если я получаю сгенерированный запрос из журнала и помещаю его в sqlite, он выполняется успешно и возвращается порядок чтения. Есть ли ошибка в NHibernate? Является ли проблема отображения? Или это проблема с SQLite?

ответ

0

Ok, наконец, я нашел проблему: имя столбца внешнего ключа «OrderId». Nhibernate ищет «Hibernate.Order» В этом случае я не знаю почему, но после того, как я изменил имя столбца, элемент теперь извлекается из db. Спасибо всем за ваши ответы! Я дал щедрость пользователю Syed Farjad Zia Zaid i, потому что он помог мне изолировать проблему. Было ясно, что это проблема Нюберната, поэтому еще раз спасибо.

-1

Тот же сценарий отлично работает со следующим кодом в репозитории.

-1

Измените класс следующим образом:

public class ReadingOrder 
{ 
    public virtual int Id { get; set; } 
    public virtual Order Order { get; set; } 
    public virtual int OrderId { get; set; } // Explicit and direct foreign Key 
} 

, а затем получить ваш запрос с использованием OrderId вместо Order.Id:

var readingO = _repositoryFactory.GetRepository<ReadingOrder>() 
           .FirstOrDefault(xz => xz.OrderId == 1); 
0

Есть два способа, которые я вижу вы можете сделать эту работу либо измените свое картографирование как:

Table("db_ReadingOrder"); 
Id(o => o.Id).Column("Id").GeneratedBy.Identity(); 
References(o => o.Order); 

, а затем запрос:

var readingO = _repositoryFactory.GetRepository<ReadingOrder>().FirstOrDefault(xz => xz.Order.Id == 1); 

В противном случае вы можете изменить отображение, как:

Table("db_ReadingOrder"); 
Id(o => o.Id).Column("Id").GeneratedBy.Identity(); 
References(o => o.Order).Column("OrderId"); 

, а затем запрос:

var readingO = _repositoryFactory.GetRepository<ReadingOrder>().FirstOrDefault(xz => xz.Order.OrderId == 1); 
+0

Тот же результат ... для этих двух сопоставлений. Но, как обновление, он работает для всех остальных объектов, кроме этого. –

+0

, если он работает со всеми другими объектами, попробуйте воспроизвести эту проблему в отдельном проекте ... –

+0

Я попытался в отдельном проекте ... не проблема с инфраструктурой сущностей!это проблема Nhibernate, я думаю –