Fluent nhibernate 使用Fluent Nhibernate AutoMap时,我的多对多(使用cascade all)没有插入/更新子项

Fluent nhibernate 使用Fluent Nhibernate AutoMap时,我的多对多(使用cascade all)没有插入/更新子项,fluent-nhibernate,nhibernate-mapping,many-to-many,cascade,Fluent Nhibernate,Nhibernate Mapping,Many To Many,Cascade,以下是我的场景(在阅读了Fluent的第一个项目和自动映射页面之后)。我的设置几乎相同,只是有些约定不同于默认设置,如表名和外键列名。我已经为所讨论的多对多关系提供了手动覆盖;一边是相反的,另一边不是。由于某些原因,这仍然不是级联add。我可以单独手动添加图像。我还可以成功地在层次结构上下读取整个模式 我试着省去了手动的许多映射覆盖;但我最终在select中得到了一个时髦的表名ImageToPhotoSession,但失败了 有什么想法吗 我应该提到我正在使用: Nhibernate 3 流利1

以下是我的场景(在阅读了Fluent的第一个项目和自动映射页面之后)。我的设置几乎相同,只是有些约定不同于默认设置,如表名和外键列名。我已经为所讨论的多对多关系提供了手动覆盖;一边是相反的,另一边不是。由于某些原因,这仍然不是级联add。我可以单独手动添加图像。我还可以成功地在层次结构上下读取整个模式

我试着省去了手动的许多映射覆盖;但我最终在select中得到了一个时髦的表名
ImageToPhotoSession
,但失败了

有什么想法吗

我应该提到我正在使用: Nhibernate 3 流利1.2(测试版)

配置:

private readonly static ISessionFactory factory =
Fluently.Configure()
    .Database(MySQLConfiguration.Standard.ShowSql().ConnectionString(o => o.FromConnectionStringWithKey("Default")))
.Mappings(m =>
    m.AutoMappings.Add(AutoMap.AssemblyOf<Data.Image>(new TestMappingConfig())
        .Override<Data.PhotoSession>(map => map
            .HasManyToMany<Data.Image>(o => o.Images)
            .Cascade.All()
            .Table("photo_session_image"))
        .Override<Data.Image>(map => map
            .HasManyToMany(x => x.PhotoSessions)
            .Cascade.All()
            .Inverse()
            .Table("photo_session_image"))
        .Conventions.Add(
            Table.Is(x => Inflector.Net.Inflector.Underscore(x.EntityType.Name)),
            DefaultLazy.Always(),
            DefaultCascade.All(), 
            ForeignKey.EndsWith("Id")
 )))
.BuildSessionFactory();

事实证明,我并没有将我的操作包装在会话事务中。查看Fluent NHibernates网站上的示例:

using (var session = sessionFactory.OpenSession())
{
    using (var transaction = session.BeginTransaction())
    {
     //... do stuff 
    }
}
在这种情况下,考虑到IoC,
存储库
类在内部保留对
ISession
ITransaction
的引用。会话完成后,我建立了一个新的事务。然后,我使
存储库
IDisposable
,在处理时,我提交了事务并关闭了会话。我不应该引用
存储库之外的任何Nhib内容

最后,我的代码如下所示:

using (var repo = new Repository())
{
   ///do the same stuff in my third code sample from the question...
}

事实证明,我并没有将我的操作包装在会话事务中。查看Fluent NHibernates网站上的示例:

using (var session = sessionFactory.OpenSession())
{
    using (var transaction = session.BeginTransaction())
    {
     //... do stuff 
    }
}
在这种情况下,考虑到IoC,
存储库
类在内部保留对
ISession
ITransaction
的引用。会话完成后,我建立了一个新的事务。然后,我使
存储库
IDisposable
,在处理时,我提交了事务并关闭了会话。我不应该引用
存储库之外的任何Nhib内容

最后,我的代码如下所示:

using (var repo = new Repository())
{
   ///do the same stuff in my third code sample from the question...
}

我做了进一步的测试,发现如果插入一个新的父对象(新的父对象,新的子对象),级联可以用于一对多关系。但是,如果您有一个现有的父对象,并且已经向其中添加了一个新的子实例,则保存父对象不会将插入级联到新的子对象。(如果有道理的话)。此处的多对多表
photo\u session\u image
仍未插入。我进一步测试发现,如果插入新父级(新父级,新子级),级联适用于一对多关系。但是,如果您有一个现有的父对象,并且已经向其中添加了一个新的子实例,则保存父对象不会将插入级联到新的子对象。(如果有道理的话)。此处的多对多表
photo\u session\u image
仍未插入。
using (var repo = new Repository())
{
   ///do the same stuff in my third code sample from the question...
}