2014-12-05 58 views
2

我在我的数据库中有三张表:图像,图像标签,标签。图像和标签通过ImagesTags表格具有多对多的关系。 图片实体:NHibernate不更新多对多连接表

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 d没有更新,但其他图像属性(名称)更新。

public void Update (Image image) 
    { 
     session.SaveOrUpdate(image); 
     session.Flush(); 
    } 

寻找一些帮助,如何更新连接表。

回答

0

的问题是在映射,明确在.Inverse()设置

public ImageMap() 
{ 
    ... 
    HasManyToMany(f => f.Tags) 
     .Table("ImageTags") 
     .LazyLoad() 
     .Inverse()   // WRONG, remove this 
     .Cascade.SaveUpdate(); 
} 

为什么?这种设置适用于两种情况,例如,如果这将是对标签的一面:

public TagMap() 
{ 
    ... 
    HasManyToMany(f => f.Images) 
     .... 
} 

在这种情况下,我们将有两端,映射,我们必须指导NHibernate的,这到底是高手。 实际上,通过设置.Inverse() - 我们设置了从

如此,是因为在我们的例子中,我们没有另一端是管理配对表......我们不能用逆设置。而已。只要删除它,NHibernate会像我们预期的那样行事

+0

谢谢,它按预期工作。 – user3450929 2014-12-06 10:36:58

+0

很高兴见到先生;)享受惊人的NHiberante;) – 2014-12-06 10:37:30