NHibernate - 将两个相同类型的集合映射到数据库

时间:2012-01-10 08:02:28

标签: nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

NHibernate映射问题。 我有一个名为User的实体和一个名为Menu的实体。用户包含两个菜单集。

public class User 
{
    public List<Menu> History {get; set;}
    public List<Menu> Favourites {get; set;}
}

public class Menu
{
    public string Name {get; set;}
    ...
}

无论如何,我可以在不创建新实体的情况下为User和Menu生成两个关系表(UserHistory和UserFavourites可能......),每个包含从UserIds到MenuIds的映射?是否可以仅使用映射(如果可能,FluentNHibernate映射)?或者有更好的方法来做我想在这里做的事情吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

我使用

public class UserMap : ClassMap<User>
{
     References(m => m.History).Column("HistoryId");
     References(m => m.Favourites).Column("FavouritesId");   
}
用户

和UserHistory和UserFavourites的子类菜单。

public class MenuMap : ClassMap<Menu>
{
  public ParentMap()
  {
    Id(x => x.Id);
    Map(x => x.Name);

    DiscriminateSubClassesOnColumn("type");
  }
}
public class ChildMap : SubclassMap<Child>
{
  public ChildMap()
  {
    Map(x => x.AnotherProperty);
  }
}

答案 1 :(得分:1)

这在很多方面都非常基础。

public class UserMap()
{
    HasManyTomany(m => m.History).Table("UserHistory");
    HasManyTomany(m => m.Favourites).Table("Favourites").AsSet();
}

根据上下文,您应将List<Menu>更改为相应的界面

无序但独特:

  • ISet<Menu>(。net4)/ ICollection<Menu>(。net&lt; 4)
  • 添加到hasmanytomany .AsSet()

按顺序排序:

  • IList<Menu>
  • 添加到hasmanytomany AsList("indexcolumnName"),它将自动添加和维护索引列到中间表

答案 2 :(得分:-1)

您是否尝试在映射中使用两个单独的表:

this.References(x => x.Favorites).Table("Favorites");
this.References(x => x.History).Table("History");