NHibernate不会更新多对多连接表

时间:2014-12-05 22:58:22

标签: c# mysql nhibernate

我的数据库有三个表: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();
    }

寻求帮助,如何更新联接表。

1 个答案:

答案 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就会像我们期望的那样行事