Fluent nhibernate 使用Fluent Nhibernate AutoMap时,我的多对多(使用cascade all)没有插入/更新子项
以下是我的场景(在阅读了Fluent的第一个项目和自动映射页面之后)。我的设置几乎相同,只是有些约定不同于默认设置,如表名和外键列名。我已经为所讨论的多对多关系提供了手动覆盖;一边是相反的,另一边不是。由于某些原因,这仍然不是级联add。我可以单独手动添加图像。我还可以成功地在层次结构上下读取整个模式 我试着省去了手动的许多映射覆盖;但我最终在select中得到了一个时髦的表名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
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...
}