我正在尝试使用流畅的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
答案 0 :(得分:0)
您正在寻找子类策略。看一下这个http://nhibernate.info/doc/nh/en/index.html#inheritance
您可能希望按照每个子类策略imo。
的表来跟踪每个类的表