在我的项目中,我们一起使用Fluent NHibernate和Automapper。例如,一个简单的GetById看起来像这样:
_session.Query<TObj>().Where(x => x.Id).ProjectTo<TMap>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
TObj看起来像这样
public virtual int Id { get; set; }
public virtual IList<TChild> Children { get; set; }
具有这样的映射:
Id(x => x.Id).GeneratedBy.Identity();
HasMany(x => x.Children);
TChild看起来像这样:
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual TObj Parent { get; set; }
具有映射:
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name);
References(x => x.Parent);
在所有这些之后,我的Automapper配置将这些对象转换为较小的DTO。例如:
CreateMap<TObj, ObjDto>()
.ForMember(x => x.Id, y => y.MapFrom(z => z.Id))
.ForMember(x => x.Children, y => y.MapFrom(z => z.Children))
.ForMember(x => x.ChildCount, y => y.MapFrom(z => z.Children.Count));
CreateMap<TChild, ChildDto>()
.ForMember(x => x.Id, y => y.MapFrom(z => z.Id))
.ForMember(x => x.Name, y => y.MapFrom(z => z.Name));
所以ObjDto看起来像这样:
public int Id { get; set; }
public int ChildCount { get; set; }
public List<ChildDto> Children { get; set; }
现在我的问题:
如果我运行此代码,则会收到错误消息“必须是可还原节点”。我不知道这是什么意思。但是我注意到,只有当我得到ChildCount和我的孩子时,这种情况才会发生。如果我评论这两者之一,就不会发生。
如果我评论我的孩子,则ChildCount属性的值为3。这是正确的。但是,如果我评论ChildCount属性并仅获得Children,则Children中只有一个孩子。怎么可能呢?