Несопоставленное свойство в сопоставленном классе (Fluent NHibernate 1.1) - PullRequest
2 голосов
/ 28 июля 2010

Фон

Свободный NHibernate 1.1 (с реализацией репозитория с использованием LINQ to NHibernate) в проекте ASP.NET MVC 2 с использованием Ninject.

У меня есть сопоставленный класс (Station)с коллекцией другого сопоставленного класса (Report).Я также хотел бы, чтобы Station имел вспомогательное свойство (MostRecentReport), которое возвращает Report для этого Station с самой последней отметкой времени.

Частичная схема

Stations
--------
Id

Reports
---------
Id
StationId
Timestamp

Partial Code

public abstract class Entity
{
    public virtual int Id { get; private set; }
}

public class Station : Entity
{
    public virtual IList<Report> Reports { get; private set; }

    public Station()
    {
        Reports = new List<Report>();
    }
}

public class Report : Entity
{
    public virtual Station Station { get; set; }
    public virtual DateTime Timestamp { get; set; }
}

public StationMap : ClassMap<Station>
{
    public StationMap()
    {
        Id(s => s.Id);
        HasMany<Report>(s => s.Reports)
            .Table("Reports")
            .KeyColumn("StationId");
    }
}

public ReportMap : ClassMap<Report>
{
    public ReportMap()
    {
        Id(r => r.Id);
        References<Station>(r => r.Station, "StationId");
        Map(r => r.Timestamp);
    }
}

Я наивно пытался добавить несопоставленное свойство, которое вернуло Reports.OrderByDescending(r => r.Timestamp).FirstOrDefault(), но из-за этого "не удалось разрешить свойство: MostRecentReport" NHibernate.QueryException s (даже если я не использую автоматическое сопоставление).Я также пытался реализовать его как метод с идентичным возвратом, но это вызывает исключения «Индекс вышел за пределы диапазона».

Есть ли способ заставить его работать с использованием свойства (предпочтительно) или метода?Или есть какой-то способ сопоставить его с Formula(), возможно?

Обновление

Свободная конфигурация NHibernate (происходит в переопределении Load моей реализации *1029*):

ISessionFactory sessionFactory = Fluently.Configure()
    .Database(MsSqlConfiguration.MsSql2008.ConnectionString(Settings.ConnectionString))
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Domain.Station>())
    .BuildSessionFactory();

Ответы [ 2 ]

2 голосов
/ 28 июля 2010

Нет причины, по которой вам бы пришлось отображать свойство, подобное этому, - NHibernate должен просто игнорировать его, если вы не выполняете автоматическое определение.

Я согласен с ответом Дэвида, что вы, возможно, нарушаете абстракцию модели вашего домена.

Тем не менее, я думаю, что ответ в том, что у вас есть запрос NHibernate (HQL / Criteria / LINQ) где-то (хранилище?), Который пытается получить доступ к этому свойству. То есть проблема не в отображениях, а в попытке использовать MostRecentReport при запросе базы данных / кэша.

2 голосов
/ 28 июля 2010

Я не уверен, что добавление несопоставленных свойств в ваши сущности - это хорошая идея. Лучше разделить задачи по добавлению удобных свойств в ViewModel и использовать запрос к репозиторию для получения значения.

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