流畅的NHibernate映射一个类,其中Id是对另一个类的引用

时间:2011-03-04 17:01:56

标签: nhibernate mapping fluent

我正在尝试使用流畅的nHibernate映射一个只作为其他类的容器存在的类,并且没有自己的Id。但我希望班级的Id是一个不同的班级。这实际上没有意义,用示例数据结构解释可能更容易。

abstract QueryBuilder
{
  public IEnumerable<string> Category1Keys {get; set;}
  public IEnumerable<int> Category2Ids {get; set;}
  public IEnumerable<int> Category3Ids {get; set;}
}

Set
{
  public int Id {get; set;}
  public string Name {get; set;}
  public SetQueryBuilder QueryBuilder{get; set;}
}

SetQueryBuilder : QueryBuilder
{
}

News
{
  public int Id {get; set;}
  public string Name {get; set;}
  public NewsQueryBuilder QueryBuilder{get; set;}
}

NewsQueryBuilder : QueryBuilder
{
}

现在,QueryBuilder的名称是我们用来将各种(不相关的)项目映射到相同类别的概念。所以可能使用QueryBuidler的东西是新闻,页面,权限。

因为使用QueryBuilder以相同方式映射该关系的所有各种项目,并且我们实际上使用来自一种类型的QueryBuilder的参数作为另一种类型的QueryBuilder的选择标准(即,如果新闻具有A的QB,得到所有匹配相同条件的集合),我想要一个抽象的QueryBuilder类,然后为所有具有映射到所有类别的东西扩展它。

以下是查询构建器的Set DB的示例。在QueryBuilder的DB中没有实际项目 - 它由类别类连接表中的所有信息组成。

f_set
{
  set_id (PK, int)
  name (varchar)
}

f_set_cat1
{
  set_id (PK, FK, int)
  cat1_key (PK, FK, char(3))
}

f_set_cat2
{
  set_id (PK, FK, int)
  cat2_id (PK, FK, int)
}

f_set_cat3
{
  set_id (PK, FK, int)
  cat3_id (PK, FK, int)
}

我的问题是如何在nHibernate中映射QueryBuilder类的每个实例,因为它没有真正的键或表条目,我想说Id是对Set的引用,所有类别映射都使用

到目前为止,这是我流利的映射:

SetMapping : ClassMap<Set>
{
  public SetMapping()
  {
    Schema("cam");
    Table("f_set");
    Id(x => x.Id, "f_set_id").GeneratedBy.Identity();
    Map(x => x.Name, "name").Not.Nullable();
    HasOne<SetQueryBuilder>(x => x.QueryBuilder);
  }
}

SetQueryBuilderMapping : ClassMap<SetQueryBuilder>
{
  public SetQueryBuilderMapping()
  {
    References(x => x.Set, "set_id");
    HasMany(x => x.Category1Keys).Table("f_set_cat1").Element("cat1_key").KeyColumn("set_id");
    HasMany(x => x.Category2Ids).Table("f_set_cat2").Element("cat2_id").KeyColumn("set_id");
    HasMany(x => x.Category2Ids).Table("f_set_cat3").Element("cat3_id").KeyColumn("set_id");
  }
}

对绘图最后一步的任何帮助都将非常感激 谢谢 Saan

进一步调查 好吧,我已经对此进行了一些调查,并且如果我这样做的话,将这两个类合并起来可以正常工作:

CLASS:
Set
{
  public int Id {get; set;}
  public string Name {get; set;}
  //public SetQueryBuilder QueryBuilder{get; set;}

  public IEnumerable<string> Category1Keys {get; set;}
  public IEnumerable<int> Category2Ids {get; set;}
  public IEnumerable<int> Category3Ids {get; set;}
}

MAPPING
SetMapping : ClassMap<Set>
{
  public SetMapping()
  {
    Schema("cam");
    Table("f_set");
    Id(x => x.Id, "f_set_id").GeneratedBy.Identity();
    Map(x => x.Name, "name").Not.Nullable();
    //HasOne<SetQueryBuilder>(x => x.QueryBuilder);

    HasMany(x => x.Category1Keys).Table("f_set_cat1").Element("cat1_key").KeyColumn("set_id");
    HasMany(x => x.Category2Ids).Table("f_set_cat2").Element("cat2_id").KeyColumn("set_id");
    HasMany(x => x.Category2Ids).Table("f_set_cat3").Element("cat3_id").KeyColumn("set_id");
  }
}

在进行nHibernate映射时,这非常有意义,但我真的希望在单独的SetQueryBuilder类中拥有所有类别映射。

再次感谢您的帮助 Saan

1 个答案:

答案 0 :(得分:0)

您正在寻找子类策略。看一下这个http://nhibernate.info/doc/nh/en/index.html#inheritance

您可能希望按照每个子类策略imo。

的表来跟踪每个类的表