Проблемы с загрузкой NHibernate
Итак, у меня есть проблема на данный момент, которая касается либо AutoMapper, моего запроса NHibernate, либо дизайна домена / DTO.
У меня проблема в том, что когда я делаю выборку, например, ObjectA содержит список ObjectB, а ObjectB имеет свойство своего родительского ObjectA. Когда у меня есть запрос, который активно выбирает свойство ObjectB моего ObjectA, я могу бесконечно продолжать ABAbABAB и так далее.
Это означает, что когда я пытаюсь сопоставить объект домена с DTOA, который содержит ту же сделку, у DTOA есть список DTOB, а у DTOB есть свойство его родительского DTOA. Мои службы истекают при возврате этого, потому что я считаю, что я использую AutoMapper для сопоставления DomainA с DTOA, а затем потому, что DTOA.DTOB.DTOA.DTOB и т. Д. Заполняется его бесконечно сериализацией.
В любом случае, какое лучшее решение для того, что, я уверен, является старой классической проблемой, но я изо всех сил пытаюсь найти правильные вещи, чтобы напечатать в моем старом друге Google. Могу ли я заставить AutoMapper игнорировать родительский экземпляр в дочернем объекте, желательно даже если я думаю, что если бы я мог заставить Nhibernate получить список, но оставить прокси в родительском свойстве. Наихудшим решением было бы изменение объекта домена с объектами для конкретных сценариев или логической логики.
Любая помощь оценила спасибо.
РЕДАКТИРОВАТЬ - КОД
Код сопоставления
Mapper.CreateMap<DTOA, DomainA>();
Mapper.CreateMap<DomainA, DTOA>()
.ForMember(dst => dst.AProperty,
opts =>
opts.ResolveUsing<LazyLoadResolver>().FromMember(src => src.AProperty));
Доменный объект DomainA
/// <summary>
/// Data Transfer Object, object representing a user
/// </summary>
public class DomainA
{
/// <summary>
/// Gets or sets the clans.
/// </summary>
/// <value>The clans.</value>
public virtual IList<DomainB> AProperty{ get; set; }
}
Доменный объект DomainB
/// <summary>
/// DTO for clan members
/// </summary>
public class DomainB
{
/// <summary>
/// Gets or sets the ID.
/// </summary>
/// <value>The ID.</value>
public virtual int ID { get; set; }
/// <summary>
/// Gets or sets the user.
/// </summary>
/// <value>The user.</value>
public virtual DomainA BProperty{ get; set; }
}
Nhibernate запрос
return session.QueryOver<DomainA>()
.Where(a => a.ID == id)
.Fetch(a=> a.AProperty).Eager
.List<DomainA>().FirstOrDefault();
Отчет о возврате службы WCF
return AutoMapper.Map<DomainA, DTOA>(returnedDomainA);
Выполнение этого запроса с извлечением и с такой структурой домена dto и конфигурацией автоматического сопоставления означает, что мои службы отключаются без ошибок, я полагаю, что это попытка сериализации и бесконечный цикл, без выборки и списка, равного нулю, все работает нормально, конечно
1 ответ
Поэтому я решил, что два варианта решения такой проблемы
Вариант А
Измените AutoMapper для сопоставления DomainB, чтобы игнорировать свойство в DomainB, которое является экземпляром DomainA
Это будет означать, что отображение будет одним направлением, а не двунаправленным
Вариант Б
Удалите свойство DomainA из DomainB! После рассмотрения того, что я хотел, чтобы система делала, я решил удалить эти свойства, ссылающиеся на родителей