使用Fluent nHibernate映射到多个表
这是我的情况。使用Fluent nHibernate映射到多个表,nhibernate,fluent-nhibernate,mapping,Nhibernate,Fluent Nhibernate,Mapping,这是我的情况。 假设您有以下模型实体,它们各自表示单个表: 电影[电影Id、片名、分级,…] 演员[Actor_Id,FirstName,LastName,…] 董事[董事Id、名字、姓氏,…] 和另一个名为“推荐”的实体/表格,代表网站内用户之间的推荐。其理念是,推荐可以是任何类型,即有人推荐演员,或有人推荐电影。基本上,该表应该如下所示: 建议[建议Id、对象Id、对象类型,…] 这就是我陷入的困境。如何使用Fluent映射nHibernate中的这些关系? 我是说。。映射时,我不能
假设您有以下模型实体,它们各自表示单个表:
电影[电影Id、片名、分级,…]
演员[Actor_Id,FirstName,LastName,…]
董事[董事Id、名字、姓氏,…]
和另一个名为“推荐”的实体/表格,代表网站内用户之间的推荐。其理念是,推荐可以是任何类型,即有人推荐演员,或有人推荐电影。基本上,该表应该如下所示:
建议[建议Id、对象Id、对象类型,…]
这就是我陷入的困境。如何使用Fluent映射nHibernate中的这些关系? 我是说。。映射时,我不能指定运行时确定的“原因”类型(与哪个表相关),但我不能仅依赖于Id,因为它本身不能暗示它属于哪个表。
例如,想象一下建议表上的记录:
推荐标识--对象标识--对象类型
83001--4010123--“M”
基本上,我存储了一个字符标识符(在本例中“m”代表表“Movies”),以了解表对象_Id属于哪个表。如果没有对象类型,我不能只存储对象Id。
作为最后的评论,我想补充一点,我已经看到了所有每个类的表、每个子类的表、每个具体类的表的例子,但我相信这些都不适合这种情况,比如电影Id、演员Id、导演Id等等。。。它们之间都是不同的,推荐Id也是不同的。我的意思是,这里没有基类子类继承,它们根本不共享Id 我希望我能说清楚。
提前感谢。您正在寻找的NHibernate映射是
我相信您所追求的*.hbm.xml是这样的:
<class name="Recommendation" table="Recommendations">
<id name="Id">
<column name="Recommendation_Id" />
<generator class="native"/>
</id>
<any name="RecommendedObject" id-type="System.Int32" meta-type="System.String">
<meta-value value="M" class="Movie"/>
<meta-value value="A" class="Actor"/>
<meta-value value="D" class="Director"/>
<column name="Object_Type"/>
<column name="Object_Id"/>
</any>
<!-- other stuff ... -->
</class>
在推荐的映射中,您应该能够使用Fluent NHibernate实现这一点:
ReferencesAny(x => x.RecommendedObject)
.IdentityType<int>()
.EntityTypeColumn("Object_Type")
.EntityIdentifierColumn("Object_Id")
.AddMetaValue<Movie>("M")
.AddMetaValue<Actor>("A")
.AddMetaValue<Director>("D");
ReferencesAny(x=>x.RecommendeObject)
.IdentityType()
.EntityTypeColumn(“对象类型”)
.EntityIdentifierColumn(“对象Id”)
.AddMetaValue(“M”)
.AddMetaValue(“A”)
.AddMetaValue(“D”);
非常感谢!!!!我已经测试过了,似乎效果不错。说真的,非常感谢丹尼尔!:=)请举例说明如何通过object\u Id
进行过滤来查询对象推荐对象
?@Christian,你指的是什么?应该注意的是,fluent nHibernate目前不支持多对多,这正是我所认为的。除非我错了,否则在更新电影时保存推荐不会无缝进行。丹尼尔的回答几乎是我能找到的任何其他答案;o) 如果您想映射任何
关系的另一面,如在电影推荐
中,我相信您可以使用集合上的一对多
和where=“Object_Type='M'”
属性来实现这一点,您可以使用Fluent NHibernate来实现。