2015-10-18 184 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

相关问题