我的数据库有三个表:Images,ImageTags,Tags。图像和标签通过ImagesTags表具有多对多关系。 图像实体:
public class Image
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Tag> Tags { get; set; }
}
标签实体:
public class Tag
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
图片地图:
public ImageMap()
{
Table("Images");
Id(x => x.Id).GeneratedBy.Identity();
Map(m => m.Name).Length(100).Not.Nullable();
HasManyToMany(f => f.Tags).Table("ImageTags")
.LazyLoad().Inverse().Cascade.SaveUpdate();
}
标签地图:
public TagMap()
{
Table("Tags");
Id(x => x.Id).GeneratedBy.Identity();
Map(m => m.Name).Length(100).Not.Nullable();
}
当我尝试更新图片时,联接表ImagesTag不会更新,但其他图片属性(名称)会更新。
public void Update (Image image)
{
session.SaveOrUpdate(image);
session.Flush();
}
寻求帮助,如何更新联接表。
答案 0 :(得分:0)
问题在于映射,明确在 .Inverse()
设置中
public ImageMap()
{
...
HasManyToMany(f => f.Tags)
.Table("ImageTags")
.LazyLoad()
.Inverse() // WRONG, remove this
.Cascade.SaveUpdate();
}
为什么呢?这种情况适用于我们mapp两端的情况,例如:如果这将在标签方面:
public TagMap()
{
...
HasManyToMany(f => f.Images)
....
}
在这种情况下,我们会有两端,映射,我们必须指示NHibernate,哪一端是主。 事实上,通过设置 .Inverse()
- 我们设置了奴隶
所以,因为在我们的例子中,我们没有另一端管理配对表......我们不能使用反向设置。而已。只要删除它,NHibernate就会像我们期望的那样行事