我在使用nhibernate保存多对多关系时遇到了麻烦。我搜索并查看了几乎每个相同的问题在SO和谷歌但没有任何作用。 单个类正确更新,但在连接表中没有插入任何内容。
我有两个课程:活动和类别。
映射是这样的(我更新了两个映射并添加了一些代码):
事件:
<bag name="Categories" access="field.camelcase-underscore" table="EventCategories" cascade="all-delete-orphan" lazy="true">
<key column="Event"/>
<many-to-many class="Category" column="Category"/>
</bag>
类别:
<bag name="Events" table="EventCategories" access="field.camelcase-underscore" inverse="true" cascade="all-delete-orphan" lazy="true" >
<key column="Category"/>
<many-to-many class="Event" column="Event"/>
</bag>
生成事件+类别的代码是
public void AddEvent(EventInputModel model)
{
var rawCategories = model.Categories.Split(',');
IEnumerable<Category> categories = _repository.GetCategories(rawCategories);
foreach (var category in rawCategories)
{
var c = categories.Where(p => p.Name.ToLower().Equals(category));
if (c.Any())
{
model.Event.AddCategory(c.First<Category>());
}
else
{
model.Event.AddCategory(new Category() { Name = category });
}
}
_repository.Save(model.Event);
}
public void Save(Event p)
{
using (var t = Session.BeginTransaction())
{
Session.SaveOrUpdate(p);
t.Commit();
}
}
我试图在两个映射中交换每个参数但没有任何作用......
你知道我做错了什么,或者对于这种情况有正确的映射吗?
非常感谢!
答案 0 :(得分:1)
以下代码应正确保存:
using (var tx = session.BeginTransaction())
{
var category = new Category { Events = new List<Event> { new Event() } };
session.Save(category);
tx.Commit();
}
在这种情况下,我正在使用新事件保存新类别,但使用现有类别也应该有效。
重要的是要注意,与我编写的代码完全相反(带有包含新类别的集合的事件)不因Inverse
而保存关系。
答案 1 :(得分:0)
您应该对单个事务中的实体进行所有更改。你应该在获得类别之前开始它。
答案 2 :(得分:0)
因此。我不知道究竟是什么,但我得到了这个工作。在尝试不同的配置后,我得到了正确的配置,我在这里发布了整个代码。
Event类中的映射是:
<bag name="Categories" access="field.camelcase-underscore" table="EventCategories" cascade="all-delete-orphan" lazy="true">
<key column="Event"/>
<many-to-many class="Category" column="Category"/>
</bag>
对于类别是:
<bag name="Events" table="EventCategories" access="field.camelcase-underscore" inverse="true" cascade="all-delete-orphan" lazy="true" >
<key column="Category"/>
<many-to-many class="Event" column="Event"/>
</bag>
保存到db的代码只是:
Session.SaveOrUpdate(p);
Session.Flush();
无需交易。它有效。