2015-10-18 172 views
0

我有三張桌子在與下面的nhibernate地圖多對多的關係。我的對象也在下面。投資組合項目可以有許多標籤。我遇到的問題是許多到許多Nhibernate - 重複的記錄和沒有插入

1)更新保存另一個標籤,即使名稱與上次相同。因此,當標籤相同時,重複記錄會插入到標籤中。例如,如果一個投資組合對象的標籤是abc,那麼添加標籤的下一個投資組合項目應引用此記錄而不是重新插入abc。我認爲這是因爲標籤地圖中的id列。 Nhibernate需要一個身份證。

2)創建不會在連接表中添加記錄。連接表中的記錄僅在更新時添加。

域對象

public class Portfolio { 
    public Portfolio() { 
     PortfolioImage = new List<Portfolioimage>(); 
     Tag = new List<Tag>(); 
    } 
    public virtual int PortfolioId { get; set; } 
    public virtual string AliasTitle { get; set; } 
    public virtual string MetaDescription { get; set; } 
    public virtual string Title { get; set; } 
    public virtual string Client { get; set; } 
    public virtual string Summary { get; set; } 
    public virtual string Url { get; set; } 
    public virtual string MainImage { get; set; } 
    public virtual string TitleAlt { get; set; } 
    public virtual string Description { get; set; } 
    public virtual IList<Portfolioimage> PortfolioImage { get; set; } 
    public virtual IList<Tag> Tag { get; set; } 
} 

public class Portfoliotag { 
    public virtual int Id { get; set; } 
    public virtual Portfolio Portfolio { get; set; } 
    public virtual Tag Tag { get; set; } 
} 

public class Tag { 
    public Tag() { 
     Portfolio = new List<Portfolio>(); 
    } 
    public virtual int TagId { get; set; } 
    public virtual string TagVal { get; set; } 
    public virtual IList<Portfolio> Portfolio { get; set; } 
} 

地圖

 public class PortfolioMap : ClassMap<Portfolio> { 

     public PortfolioMap() { 
      Table("Portfolio"); 
      LazyLoad(); 
      Id(x => x.PortfolioId).GeneratedBy.Identity().Column("PortfolioId"); 
      Map(x => x.AliasTitle).Column("AliasTitle").Not.Nullable(); 
      Map(x => x.MetaDescription).Column("MetaDescription").Not.Nullable(); 
      Map(x => x.Title).Column("Title").Not.Nullable(); 
      Map(x => x.Client).Column("Client").Not.Nullable(); 
      Map(x => x.Summary).Column("Summary").Not.Nullable(); 
      Map(x => x.Url).Column("Url"); 
      Map(x => x.MainImage).Column("MainImage"); 
      Map(x => x.TitleAlt).Column("TitleAlt"); 
      Map(x => x.Description).Column("Description").Not.Nullable(); 
      HasMany(x => x.PortfolioImage).KeyColumn("PortfolioId").Inverse(); 
      HasManyToMany(x => x.Tag).Table("PortfolioTag").ParentKeyColumn("PortfolioId").ChildKeyColumn("TagId").LazyLoad().Cascade.All().Fetch.Join(); 
     } 
    } 

     public class PortfoliotagMap : ClassMap<Portfoliotag> { 

     public PortfoliotagMap() { 
      Table("PortfolioTag"); 
      LazyLoad(); 
      Id(x => x.Id).GeneratedBy.Identity().Column("Id"); 
      References(x => x.Portfolio).Not.Nullable().Cascade.SaveUpdate().Column("PortfolioId"); 
      References(x => x.Tag).Not.Nullable().Cascade.SaveUpdate().Column("TagId"); 
     } 
    } 

public class TagMap : ClassMap<Tag> { 

     public TagMap() { 
      Table("Tag"); 
      LazyLoad(); 
      Id(x => x.TagId).GeneratedBy.Identity().Column("TagId"); 
      Map(x => x.TagVal).Column("Tag").Not.Nullable(); 
      //HasMany(x => x.PortfolioTag).KeyColumn("TagId"); 
      // HasMany(x => x.PortfolioTag).Cascade.AllDeleteOrphan().Inverse().Fetch.Join().KeyColumn("TagId"); 
      HasManyToMany(x => x.Portfolio).Table("PortfolioTag").ParentKeyColumn("PortfolioId").ChildKeyColumn("TagId").LazyLoad().Inverse().Cascade.AllDeleteOrphan(); 
     } 
    } 
+0

以前的映射是正確的。我會避免多對多... –

+0

哪些以前的映射 – matt

+0

http://stackoverflow.com/q/33188831/1679310 –

回答

0

給定的類

public class Portfolio 
{ 
    public Portfolio() 
    { 
     Tag = new List<Tag>(); 
    } 
    public virtual int PortfolioId { get; protected set; } 
    public virtual IList<Tag> Tag { get; protected set; } 
} 

public class Tag 
{ 
    public virtual int TagId { get; set; } 
    public virtual string Name { get; set; } 
} 

的這種映射應該足夠

public class PortfolioMap : ClassMap<Portfolio> 
{ 
    public PortfolioMap() 
    { 
     Id(x => x.PortfolioId).GeneratedBy.Identity().Column("PortfolioId"); 

     HasManyToMany(x => x.Tag) 
      .Table("PortfolioTag") 
      .ParentKeyColumn("PortfolioId") 
      .ChildKeyColumn("TagId") 
      .Cascade.All() 
      .Fetch.Join(); 
    } 
} 

分配現有標籤必須在代碼中處理,該代碼可以比任何框架自動查詢更高效地緩存或查詢涉及的標籤。

更新:

例如使用其作品對我來說

public void Save(int portfolioId, IEnumerable<string> tagnames) 
{ 
    using (var tx = session.BeginTransaction()) 
    { 
     var tags = Session.QueryOver<Tag>().WhereProperty(x => x.Name).In(tagnames).List(); 

     var portfolio = session.Get<Portfolio>(portfolioId); 
     portfolio.Tags.Clear(); 
     portfolio.Tags.AddRange(tags); 
     tx.Commit(); 
    } 
} 
+0

嗨,我加了這個修改。仍然發生的一件事是中間連接表不插入添加記錄。它適用於更新。同時更新右表,即標籤被再次複製而不是引用現有記錄 – matt

相關問題