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

NHibernate-将两个相同类型的集合映射到数据库,nhibernate,fluent-nhibernate,nhibernate-mapping,fluent-nhibernate-mapping,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;} ... } 公共类用户 {

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;}
    ...
}
公共类用户
{
公共列表历史记录{get;set;}
公共列表收藏夹{get;set;}
}
公共类菜单
{
公共字符串名称{get;set;}
...
}
我是否可以在不创建新实体的情况下为用户和菜单生成两个关系表(可能是UserHistory和UserFavorities…),每个表都包含从userid到menuid的映射?是否可以仅使用映射(如果可能,使用FluentNHibernate映射)?还是有更好的方法来完成我在这里要做的事情

谢谢。

我会用

public class UserMap : ClassMap<User>
{
     References(m => m.History).Column("HistoryId");
     References(m => m.Favourites).Column("FavouritesId");   
}
公共类用户映射:类映射
{
参考文献(m=>m.History).Column(“HistoryId”);
引用(m=>m.favorites)。列(“favoritesid”);
}
在用户中

以及UserHistory和UserFavorites的子类菜单

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);
  }
}
公共类菜单映射:类映射
{
公共ParentMap()
{
Id(x=>x.Id);
Map(x=>x.Name);
区分子类子列(“类型”);
}
}
公共类ChildMap:子类映射
{
公共儿童地图()
{
Map(x=>x.AnotherProperty);
}
}

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

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

这是相当基本的,这里有很多

public class UserMap()
{
    HasManyTomany(m => m.History).Table("UserHistory");
    HasManyTomany(m => m.Favourites).Table("Favourites").AsSet();
}
根据上下文,您应该将
列表
更改为相应的界面

无序但独特:
  • ISet
    (.net4)/
    ICollection
    (.net<4)
  • 添加到hasmanytomany
    .AsSet()
订购人添加:
  • IList
  • 添加到hasmanytomany
    AsList(“indexcolumnName”)
    ,它将自动向中间表添加并维护索引列

谢谢你,约翰。此解决方案是否会在表菜单中创建额外的记录,其中包含鉴别器列和UserHistory/userfavorites值?我希望有一个解决方案只涉及在链接表中创建记录,而不涉及菜单表。历史和最爱都是菜单,它们都没有额外的字段……我想我误解了你的问题。如您所述,这将创建一个额外的记录。无论如何,谢谢。我不确定我要做的事情是否可以实现…也许创建新记录或新实体是唯一的方法…引用实体时忽略表。它仅用于值集合(元素)、组件集合(复合元素)和多对多关系。这甚至不会编译,因为引用返回的生成器对象没有方法表()