NHibernate 3.1 игнорирует вычисляемую формулу столбца - PullRequest
4 голосов
/ 22 апреля 2011

У меня есть класс с двумя вычисляемыми столбцами. Формулы - это операторы select, которые получают значения из других таблиц, например:

private const string VOTES_FORMULA = "(select count(v.id) from Votes v where v.BusinessID = Id)";
private const string SURVEY_FORMULA = "(select cast((case when exists (select * from surveys s where s.businessid = Id) then 1 else 0 end) as bit))";

// in my bootstrap code...
mappings.Override<Business>(map =>
{
    map.IgnoreProperty(x => x.IsNewRecord);
    map.IgnoreProperty(x => x.IdString);
    map.Map(x => x.UserPassword).CustomType<EncryptedStringType>();
    map.Map(x => x.HasTakenSurvey).Formula(SURVEY_FORMULA).Not.Insert().Not.Update();
    map.Map(x => x.Votes).Formula(VOTES_FORMULA).Not.Insert().Not.Update();
});

Это все работало нормально с Fluent NHibernate 1.1 (с использованием NHibernate 2.1), но я только что обновился до 1.2 (с использованием NH 3.1), и кажется, что Fluent NHibernate игнорирует формулы. Я получаю исключение «недопустимое имя столбца» для двух полей HasTakenSurvey и Votes, потому что оно «пытается запросить столбцы напрямую, а не выполняет формулы, как указано». Пример запроса:

exec sp_executesql N'select TOP (@ p0) business0_.Id в качестве Id0_, business0_.UserPassword в качестве UserPass2_0_, business0_.HasTakenSurvey как HasTaken3_0_, business0_.Totes как Votes0_, business0__00_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0 .BusinessName как Business7_0_, business0_.BusinessType как Business8_0_, business0_.BusinessImageUrl как Business9_0_, business0_.BusinessDescription как Busines10_0_, business0_.EmployeeCount как Employe11_0_, business0_.OwnerFirstName_OWO0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0__0 as Busines15_0_, business0_.BusinessAddress2 as Busines16_0_, business0_.BusinessCity as Busines17_0_, business0_.BusinessState as Busines18_0_, business0_.BusinessPostal as Busines19_0_, business0_.BusinessCountry в виде Busines20_0_ user_0_0_0ser_040 , business0 _.UserIpAddress as UserIpA24_0_, business0_.OptInReminders как OptInRe25_0_, business0_.OptInOffers как OptInOf26_0_, business0_.OptInSms как OptInSms0_, business0_.Created как созданный 0, business0_0_BusinessBedized. @ p0 int ', @ p0 = 25

Изменилась ли реализация? Что я делаю не так?

1 Ответ

2 голосов
/ 22 апреля 2011

Как отмечено в комментариях ConventionBuilder.Property.Always (x => x.Column (x.Property.Name)) добавлял столбец ко всем свойствам (и переопределял формулу).

Добавление.Columns.Clear () для сопоставления должен удалить столбец, поэтому:

mappings.Override<Business>(map =>
{
    map.IgnoreProperty(x => x.IsNewRecord);
    map.IgnoreProperty(x => x.IdString);
    map.Map(x => x.UserPassword).CustomType<EncryptedStringType>();
    map.Map(x => x.HasTakenSurvey).Formula(SURVEY_FORMULA).Not.Insert().Not.Update().Columns.Clear();
    map.Map(x => x.Votes).Formula(VOTES_FORMULA).Not.Insert().Not.Update().Columns.Clear();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...