请帮助我将这个简单流畅的nhibernate映射带入生活
本文关键字:nhibernate 映射 生活 帮助 简单 | 更新日期: 2023-09-27 18:04:44
这一切似乎都很简单,但我还是找不到我的问题的答案。
假设我有两个表TableA和TableB,它们可以保存对第三个表的单个引用:
TableA TableB TableC
ID ID ID
TableC_ID TableC_ID RandomDataC
RandomDataA RandomDataB
每个都由以下类表示:
public Class ClassA{
public virtual int Id{get;set;}
public virtual ClassC ObjAC{get;set;}
...
}
public Class ClassB{
public virtual int Id{get;set;}
public virtual ClassC ObjBC{get;set;}
...
}
public Class ClassC{
public virtual int Id{get;set;}
...
}
正如你所看到的,ClassA和ClassB拥有一个名为ClassC的属性。
我已经尝试了以下映射(在其他…)
public Class ClassAMap : ClassMap<ClassA>{
public ClassAMap(){
Id(x => x.Id);
HasOne(x => x.ObjAC).Cascade.All();
...
}
}
public Class ClassBMap : ClassMap<ClassB>{
public ClassBMap(){
Id(x => x.Id);
HasOne(x => x.ObjBC).Cascade.All();
...
}
}
public Class ClassCMap : ClassMap<ClassC>{
public ClassCMap(){
Id(x => x.Id);
}
}
但是映射不正确。我试过ClassCMap有一个参考,但没有成功。
请帮…
试试这个:
public Class ClassAMap : ClassMap<ClassA>{
public ClassAMap(){
Id(x => x.Id);
References(x => x.ObjAC, "TableC_ID").Cascade.All();
...
}
}
public Class ClassBMap : ClassMap<ClassB>{
public ClassBMap(){
Id(x => x.Id);
References(x => x.ObjBC, "TableC_ID").Cascade.All();
...
}
}
public Class ClassCMap : ClassMap<ClassC>{
public ClassCMap(){
Id(x => x.Id);
}
}
您可能还需要确保推断出正确的表名。问题是HasOne映射到一个实体基于表的主键的映射。
当使用HasOne时,这意味着您的表与另一个表共享相同的主键。在你的情况下,这不是真的。类A、B和C都有自己的id。查看下面的文章,详细解释了这一点:
http://jagregory.com/writings/i-think-you-mean-a-many-to-one-sir/您可能需要使用References
而不是HasOne
。HasOne有一个独特的用例。将HasOne
替换为References
。我不相信。cascade。all()也是必要的。
你可以在这里查看HasOne的用法:http://wiki.fluentnhibernate.org/Fluent_mapping.