2010-07-25 42 views
3

我有一个类包含一个使用Fluent Nhibernate映射到多对多数据库关系的集合。映射是如下 -Nhibernate中的多对多集合的更新导致连接表中的多个删除

Table("Book"); 
Id(x => x.Id); 
Map(x => x.Title); 
Map(x => x.NumberOfPages); 
HasManyToMany(x => x.Authors) 
.Cascade.AllDeleteOrphan() 
.Table("BookAuthor") 
.ParentKeyColumn("BookId") 
.ChildKeyColumn("AuthorId"); 

然后我得到这个类的一个实例,并使用下面的代码添加一个项目的作者收集 -

var book = session.CreateCriteria(typeof(Book)).UniqueResult<Book>(); 
Author author = new Author {Name="Phil Moran",Age=51}; 
book.Authors.Add(author); 
session.SaveOrUpdate(book); 

该数据库已成功更新,但NHibernate的更新BookAuthor表首先删除链接到更新图书的所有记录,然后重新填充所有数据以及新作者所需的额外记录。为什么Nhibernate这样做?我希望它只是将包含书和作者详细信息的单个记录添加到多对多表(BookAuthor)中,而不执行任何删除操作。我可以通过映射来改变这种行为吗?

回答

3

集合被映射为bag(我想这是FluentNH的默认值)。

改为使用setlistidbag

+0

感谢迭戈,我将我的收藏定义为一个IList,我认为默认情况下将收藏集映射为一个包。我将我的收藏定义更改为 - 私人ISet _authors = new HashedSet (); 公共虚拟ISet 作者.... 和一切按预期工作。 – ipr101 2010-07-28 06:08:58