0

オートマッパーでマッピングする継承を使用する複雑なオブジェクトがあります。get リクエストでは完全にマッピングされますが、ポスト リクエストでは、まったく同じコードが初期化された型を正しくマッピングしません。

説明させてください。(以下のコードを参照)

単純な get リクエスト中にオブジェクトをマップする最初のケースでは、完全に正常にマップされ、以下ParentのクラスのプロパティはAその特定のタイプBまたはC.

しかし、投稿中にまったく同じマッピングが発生した場合、のParentプロパティのA型はA!?? です。

これで、コードは同じになり、DB から返されるデータ モデルも同じになります。(私は nhibernate を使用しています - タイプは期待どおりです) 唯一の違いは、それがポスト リクエストであることです。

この場合、AutoMapper について知っておくべきことはありますか?

クラス定義 (ViewModel は同じ構造に従います):

public class A 
{
    public A Parent { get; set;}
}

public class B : A 
{ }

public class C : A 
{ }

そして、次のようにマッピングされます:

CreateMap<A, AViewModel>()  
    .Include<B, BViewModel>()
    .Include<C, CViewModel>();

CreateMap<B, BViewModel>();
CreateMap<C, CViewModel>();

呼び出しマップ:

var aModel = _aManager.Get("same parameter");
var aViewModel = Mapper.Map<AViewModel>(aModel);

in編集 #1 - これは、投稿アクションのロジックを示しています。

    [Transaction] // Commits the nhibernate transaction on OnActionExecuted
    [HttpPost]
    public ActionResult UpdateA(OtherModelViewModel viewModel)
    { 
        var a = _aManager.Get("same parameter");

        var otherModel = Mapper.Map<OtherModel>(viewModel); 

        a.AddOtherModel(otherModel);
        _otherModelRepository.New(otherModel);

        // Eeek, writing this out I am seeing a problem here, I suspect this is where my problem would be, loading the model again from the db, after updating it in session without commiting it? I am going to change the logic and see if it fixes it.

        var aModel = _aManager.Get("same parameter");
        var aViewModel = Mapper.Map<AViewModel>(aModel);

        // return result.
    }
4

1 に答える 1

0

申し訳ありませんが、私はばかげていて、複雑さに負けてしまいました。

トランザクション属性を使用して、OnActionExecuted の情報を永続化します。

だから私がやっていたことは、 > モデルをロードする > モデルを修正する > そして再度ロードして、永続化される前にマップしようとすることでした。

nHibernate は、そのようなことをしようとすると本当に気に入らないことを知っているので、メモリ内オブジェクト グラフは流動的な状態 (コミット保留中) であり、マッピングに影響を与えていたと思います。

ロジックを変更して、更新後に ActionRedirect を実行するようにしました。これにより、マッピングの問題が解決されました。

ずっと幸せです。

于 2013-03-14T22:16:46.143 に答える