3

我在尝试使用 Fluent NHibernate 中的 Automapper 获得多对多关系以在 NHibernate 中保存连接记录时遇到问题。

SO上有很多关于这个的其他帖子,但到目前为止,他们都没有解决这个问题,想知道我是否在做一些不同的事情。

我有要映射的应用程序设置,当我在数据库中手动创建连接记录时,我确实取回了数据,因此在读取级别它正确映射,但它不会保持关系。

这是相关的映射。我正在使用具有默认约定的自动映射器,但最终基于另一篇 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

想出了解决方案,想更新以防万一有人遇到同样的问题。

您必须将保存调用包装在事务中,否则它不会提交加入记录。我最终修改了该服务代码以读取

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