编辑 - 快速总结
我意识到我有相当多的文字,所以这里是这个问题的快速总结:
<many-to-any />
Fluent NHibernate不支持- 想要拆分 XML 和 Fluent 之间的属性映射以映射
<many-to-any />
关系 - 发现这可以通过命名查询来实现
- 当我尝试同时使用 XML 和 Fluent 作为我的界面时,我得到一个
NHibernateDuplicateMappingException
- 当尝试仅对接口使用 XML 并为我的子类使用 Fluent 时,XML 映射使其进入数据库,但 Fluent 被忽略。
因为我定义了很多约定,所以我不希望仅将 XML 用于此类层次结构。
此外,如果有人知道在 Fluent 中使用多对任意的替代解决方案,我非常愿意尝试一下。
编辑 - 完整的问题和代码示例
我有两个共享多对多关系的类(我们称它们为“Foo”和“Bar”)。通常,用 Fluent 映射 this 就像扔进HasManyToMany(x => x.SomeProperty)
我的类映射一样简单;但是,我的一个界面遇到了问题。
作为参考,这里是对象的基本示例设置:
public class Foo
{
public virtual long ID { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual IList<IBar> Bars { get; set; }
}
public interface IBar
{
long ID { get; set; }
IList<Foo> Foos { get; set; }
}
由于 IBar 是一个几乎可以附加到任何类的接口,因此将在中间表上引用的任何“BarID”都可以属于任意数量的其他表。由于这是一个“多对任意”关系,Fluent 仍然不支持它(是的,我知道 NHibernate 的mapping-by-code支持它)。
幸运的是,NHibernate 的 xml 映射仍然可以在使用 Fluent 的项目中轻松使用。不过,我不想在 *.hbm.xml 文件中定义整个映射,我只想映射<many-to-any />
. 其余部分,我想保留在 Fluent 映射中(基本上,将映射分成两个文件)。
我知道这对于命名查询和存储过程之类的东西是可能的,但是我在使用这种模式来定义我的关系时遇到了一些麻烦。
这是我的 Foo 类的 Fluent 映射,就像现在一样:
public class FooMap : ClassMap<Foo>
{
public FooMap()
{
Id(x => x.ID);
Map(x => x.Name);
Map(x => x.Description);
}
}
这里是 Foo.hbm.xml 文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyProject" namespace="MyProject.Entities">
<class name="Foo" table="Foos">
<id name="ID">
<generator class="identity" />
</id>
<bag name="Bars" table="FooBarRelationship">
<key column="ID" />
<many-to-any id-type="System.Int64" meta-type="System.String">
<column name="BarID" />
<column name="BarType" />
</many-to-any>
</bag>
</class>
</hibernate-mapping>
就其本身而言,这两个都可以正常工作。例如,如果我只是使用 Fluent 映射,那么我的 Foo 表是使用三个映射列生成的。同样,如果我只使用 xml,那么 NHibernate 会创建一个带有 ID 的 Foo 表和一个 FooBarRelationship 表,其中包含 ID、Foregin Keys 和 BarType 列。但问题是:当我尝试同时使用 xml 和 Fluent 映射时,我得到一个NHibernateDuplicateMappingException
. 此外,如果我只对接口使用 XML,而对子类使用 Fluent,则完全忽略 Fluent 映射(即,它就像我只有 xml)。
我已经做了很多搜索,但我无法找到任何可能有帮助的信息。我可以对地图(甚至配置)做些什么来让它工作吗?