3

Fluent NHibernate で Automapper を使用して、NHibernate に結合レコードを保存するために多対多の関係を取得しようとすると問題が発生します。

SOにはこれに関する他の投稿がかなりありますが、これまでのところ、問題を解決したものはなく、何か違うことをしているのだろうかと思っています。

マップするアプリのセットアップがあり、DB に結合レコードを手動で作成すると、データが返されるため、読み取りレベルでは正しくマッピングされますが、関係は保持されません。

関連するマッピングは次のとおりです。デフォルトの規則でオートマッパーを使用していましたが、最終的に別の SO 投稿に基づいてこれを試しました。

.Mappings(m => {
                        m.AutoMappings.Add(AutoMap.AssemblyOf<User>);
                        m.AutoMappings.Add(AutoMap.AssemblyOf<PostalCode>);
                        m.AutoMappings.Add(
                                AutoMap.AssemblyOf<VPA>()
                                    .Override<VPA>(v => 
                                        v.HasManyToMany(x => x.PostalCodes)
                                            .Table("PostalCodesToVPAs")
                                            .ParentKeyColumn("PostalCode_Id")
                                            .ChildKeyColumn("VPA_Id")
                                            .Cascade.SaveUpdate())
                                    .Override<PostalCode>(p => 
                                        p.HasManyToMany(x => x.VPAs)
                                            .Table("PostalCodesToVPAs")
                                            .ParentKeyColumn("VPA_Id")
                                            .ChildKeyColumn("PostalCode_Id")
                                            .Cascade.SaveUpdate().Inverse())
                            );
                    })

私の実際のセーブはこんな感じです。郵便番号と vpa の両方を明示的に保存しているのでやり過ぎかもしれませんが、マッピングの逆行に問題がある人についてよく読んだので、両方を試してみたかったのです。うまくいきませんでした。

var postalCode = new PostalCode {Value ="90210", CreatedBy = 0, CreationDate = DateTime.Now, ModifiedBy = 0, ModifiedDate = DateTime.Now};
vpa.PostalCodes.Add(postalCode);
postalCode.VPAs.Add(vpa);
PostalCodeService.Save(postalCode);
VPAService.Save(vpa);

カバーの下で service.save 呼び出しが行います

return (int)Session.Save(obj);

誰もこれを見て、なぜ参加レコードを保存しないのか知っていますか?

4

1 に答える 1

5

解決策を考え出し、誰かが同じ問題に遭遇した場合に備えて更新したかった.

save 呼び出しをトランザクションでラップする必要があります。そうしないと、結合レコードがコミットされません。私はそのサービスコードを変更して読むことになりました

using (var tx = Session.BeginTransaction()) {
    Session.Save(obj)
    tx.commit();
    return obj.Id;
}
于 2012-06-27T23:07:44.313 に答える