FluentNhibernate - логический флаг, основанный на количестве из другой таблицы - PullRequest
0 голосов
/ 12 апреля 2011

Я видел несколько подобных вопросов в SO, но я все еще не могу заставить это работать в моем коде, несмотря на то, что мой код выглядит как принятые ответы.

Во-первых, мое отображение (сжато)

public SiteMap()
{
    Table("SiteDetail");

    Id(x => x.SiteId, "Id").GeneratedBy.Identity();
}

Тогда структура другой таблицы

CREATE TABLE [dbo].[EmailConfig](
    [SiteID] [int] NOT NULL,
    [Active] [int] NULL,
    [HeaderText] [int] NULL,
    [TrailerText] [int] NULL,
    [BodyText] [int] NULL,
    [CopyEmailTo] [varchar](255) NULL,
CONSTRAINT [PK_EmailConfig] PRIMARY KEY CLUSTERED ([SiteID] ASC)) 

А вот и моя собственность на моем объекте

public virtual bool EmailReceiptsEnabled { get; set; }

А вот отображение для установки этого свойства

Map(x => x.EmailReceiptsEnabled)
    .Formula("(SELECT COUNT(e.SiteId) FROM EmailConfig e WHERE e.SiteId = SiteId AND e.Active = 1)");

Когда я комментирую это отображение свойств, все работает нормально. Когда я оставляю его, мой репозиторий возвращает ноль при попытке выбрать один сайт. Не выдается никакой ошибки, кроме исключения пустой ссылки на странице, пытающейся получить доступ к свойству объекта сайта.

EDIT:

Я изменил свое решение, чтобы отодвинуть объект следующим образом:

public class EmailConfiguration : CoreObjectBase
{
    public virtual int SiteId { get; set; }
    public virtual int Active { get; set; }
}

С недвижимостью в моем Site классе

public virtual EmailConfiguration EmailConfiguration { get; set; }

И отображение для объекта

public class EmailConfigurationMap : ClassMap<EmailConfiguration>
{
    public EmailConfigurationMap()
    {
        Table("EmailConfig");

        Id(x => x.SiteId);

        Map(x => x.Active);
    }
}

А потом отображение на моем сайте

References(x => x.EmailConfiguration, "Id");

и выдает ошибку

NHibernate.ObjectNotFoundException: строки с данным идентификатором не существует

Проблема заключается в том, что EmailConfig не содержит записи, пока клиент не войдет в приложение для настройки своей электронной почты. Это нельзя изменить, но мне нужно, чтобы мое приложение могло использовать эти данные. Любые идеи о том, как отобразить эту вещь?

Еще одно редактирование

Я смог заставить его работать, изменив свойство на

public virtual IList<EmailConfiguration> EmailConfigurations { get; set; }

А затем реализовать это полное бедствие

HasMany<EmailConfiguration>(x => x.EmailConfigurations)
    .KeyColumn("SiteId")
    .Inverse();

Думаю, я буду тихо плакать, пока не пойму, как заставить этот беспорядок работать правильно. Так как таблица EmailConfig использует PK моей таблицы сайта в качестве своего первичного ключа, единственные возможности - иметь 1 или не иметь записей. References завершается с ошибкой с серьезной ошибкой. HasOne тоже не работает (программа вообще не возвращает мои Site объекты без каких-либо ошибок).

...