我在尝试解决模型中的子实体时遇到了一系列问题,我使用 nhibernate 进行持久性,使用 Windsor 进行 ioc 和 automapper 进行映射。
我已经以多种方式对此进行了攻击,并且几乎总是在此过程中被阻止,任何帮助将不胜感激。
我对下面代码的问题是,当我尝试通过以下方式更新页面布局时。(假设只有 layout-id 正在改变)
var page = _pageRepository.Get(model.Id);
Mapper.Map(model, page);
using (ITransaction tran = _sessionFactory.BeginTransaction())
{
_pageRepository.Update(page);
tran.Commit();
}
我得到一个很好的错误说,
具有相同标识符值的不同对象已与会话相关联:对于布局模型。
现在我尝试了: - 将设施更改为 perwebrequest(然后说会话已关闭) - 尝试在获取缓存后从缓存中删除布局(错误如上) - 我尝试在解析器中获取现有会话(上下文错误)
我应该如何进一步解决这个问题?肯定不能这么难!我哪里错了?非常感谢。
这是所有重要的部分。
我有一个这样的模型:
public class ContentPage : Page
{
public virtual Layout Layout { get; set; }
}
我使用持久化工具来管理我的休眠会话,如下所示:
Kernel.Register(
Component.For<ISessionFactory>()
.UsingFactoryMethod(_ => config.BuildSessionFactory()),
Component.For<ISession>()
.UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession())
.LifestylePerThread() <-- IMPORTANT FOR LATER.
);
我的映射是这样的:
CreateMap<BlaViewModel, ContentPage>()
.ForMember(dest => dest.DateModified, src => src.MapFrom(x => DateTime.UtcNow))
.ForMember(x => x.Layout, x => x.ResolveUsing<EntityResolver<Layout>>().FromMember(y => y.Layout_Id));
最后我的解析器是这样的:
public class EntityResolver<T> : ValueResolver<Guid, T> where T : EntityBase
{
private readonly ISession _session;
public EntityResolver(ISession session)
{
_session = session;
}
protected override T ResolveCore(Guid id)
{
var entity = _session.Get<T>(id);
return entity;
}
}