2013-07-16 2 views
1

Я думал, что это будет легко найти, но у меня проблемы. У меня есть класс, который наследуется от класса EntityBase, который имеет поле ID. базовый класс выглядит следующим образом.Перевернутый столбец при сопоставлении с NHibernate

//Here is the declaration 
public abstract class EntityBase<IdType> 

//here is the property 
private IdType _id; 
public virtual IdType ID 
{ 
    get 
    { 
     return _id; 
    } 
    set 
    { 
     _id = value; 
    } 
} 

Это отлично работает для большинства субъектов, но у нас есть объект, который на самом деле будет построен из хранимой процедуры, которая работает на другую БД, и проблема, в отличии от нашей БД возвращает «Id» не «ID» У меня есть попробовал несколько вещей, чтобы переопределить это и установить идентификатор, но я получаю следующее сообщение об ошибке

NHibernate.PropertyNotFoundException: не удалось найти Присваиватель свойства «Id» в классе

public class ListingMapping : IAutoMappingOverride<Listing> 
{ 
    public void Override(AutoMapping<Listing> mapping) 
    { 
     mapping.Map(x => x.ID).Column("Id"); 
     mapping.Id(x => x.ID).Column("Id"); 
    } 
} 

Вот как объект становится создано.

public Listing GetListingById(Guid ListingId) 
{ 
    IQuery query = GetSession().GetNamedQuery("GetListingById") 
         .SetParameter("ListingId", ListingId) 
         .SetResultTransformer(Transformers.AliasToBean<Listing>()); 

    return (query.UniqueResult<Listing>()); 
} 

Я знаю, что автоматические сопоставления загружаются, потому что они работают для других типов, где мы переопределяем схему. Надеюсь, это достаточно информации, и кто-то может указать мне в правильном направлении.

ответ

3

Ваша проблема не имеет ничего общего с сопоставлениями NHibernate. Сопоставления не задействуются при использовании именованных запросов и трансформаторов результатов.

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

У вас есть 4 решения:

  1. Если вы можете изменить хранимую процедуру, изменить его, чтобы вернуть правильный случай. Пример: select Id as ID.

  2. Переименуйте ID Собственость в EntityBase для Id и отобразить его в ID колонке.

  3. Если это изолированная ситуация, отбросьте наследование с EntityBase и добавьте свойство, называемое Id.

  4. Напишите свою собственную реализацию NHibernate.Transform.IResultTransformer. Посмотрите https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Transform/AliasToBeanResultTransformer.cs

+0

Да, в конце концов, я получил кто-то, чтобы изменить хранимую процедуру. Я подозревал, что сопоставления ничего не сделали в этом случае, однако спасибо за подтверждение этого. – Kenn

+0

Это решило мою проблему !! В моем случае имя свойства было как ContactCode, но я использовал CreateSQLQuery и передавал псевдоним моего свойства без кавычек. После проведения кавычек моя проблема была решена. Большое спасибо за этот ответ !!! –

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