モデルの子エンティティを解決しようとして一連の問題が発生しています。永続化には nhibernate、ioc には windsor、マッピングには 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; }
}
次のように永続的な機能を使用して、nhibernate セッションを管理します。
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;
}
}