не удалось получить значение поля по отражению getter ... кеш запросов nhibernate с кешем 2-го уровня - PullRequest
0 голосов
/ 16 июня 2011

Я получил это исключение

не удалось получить значение поля с помощью метода получения отражения DictionaryMaster. k__BackingField

with this inner exception:

Field '<>k__BackingField' defined on type is not a field on the target object which is of type 'System.Object[]'.

The problem exists only when i use eagerloading in query. Below i put my classes, relations and query.

public class DictionaryMaster
    {
        public virtual IList DictionaryItems { get; private set; }
        public virtual System.String Code { get; private set; }
        public virtual System.String Description { get; private set; }
    }

   public class DictionaryMasterMap : ClassMap
    {
        public DictionaryMasterMap()
        {
            Cache.ReadOnly().Region("dictionary");
            LazyLoad();

            Id(x => x.Code) //i know this is so ugly
                .Column("DC_Code")
                .GeneratedBy.Assigned(); 
            Map(x => x.Description).Column("DC_Desc");
            HasMany(x => x.DictionaryItems)
                .Cascade.AllDeleteOrphan()
                .Fetch.Select()
                .AsBag()
                .Inverse()
                .Not.LazyLoad()
                .KeyColumns.Add("DI_DCCode");
        }
    }

 public class DictionaryItem
    {
        public virtual int Id { get; private set; }
        public virtual string Code { get; private set; }
        public virtual DictionaryMaster DictionaryMaster { get; private set; }
        public virtual string Description { get; private set; }
}

   public class DictionaryItemMap : ClassMap
    {
        public DictionaryItemMap()
        {
            Cache.ReadOnly().Region("dictionary");

            Id(x => x.Id)
                .Column("DI_Id").GeneratedBy.Identity();

            Map(x => x.Code).Column("DI_Code");
            Map(x => x.Description).Column("DI_Desc");
            References(x => x.DictionaryMaster).Column("DI_DCCode");
        }
    }

Запрос:

session.Query<DictionaryMaster>()
                    .Fetch(x => x.DictionaryItems)
                    .Cacheable()
                    .CacheMode(CacheMode.Normal)
                    .ToList();
</code>

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

Я подозреваю, что многие пользователи сталкиваются с этой проблемой - возможно, если вы отмените свой ответ как выбранный ответ, вопросу будет уделено больше внимания.AFAIK, до сих пор нет обходного пути, который позволяет использовать Linq, Cacheable () и Fetch () в одном вызове.

Это подразумевается как комментарий, однако, вероятно, из-за моего низкого рейтинга SO я не могу создавать комментарии.

Приветствия,

Jonno

0 голосов
/ 17 июня 2011

Я нашел, что не так:

Во-первых: я действительно не знаю, почему Fluent NHibernate отображает мой Id с использованием FieldBacking, потому что у меня есть доступ к свойству.

Второе: когда я удалил приватный модификатор для сеттера, он показал следующее исключение:

Исключение произошло, получатель ххх '

Исключение привело меня на эту страницу https://nhibernate.jira.com/browse/NH-2587. И теперь я задаюсь вопросом о некоторых обходных путях. Есть идеи?

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