2014-12-05 106 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