在运行时扩展/修改NHibernate类

抱歉,如果已经有一个点答案,但我还没有找到答案。 我正在使用NH3,我有一个用例,我想在任何实体上添加一个Set,它实现了一个特定的接口。 我有一个配置构建器类,所以我可以在创建会话工厂之前进行这些更改。

鉴于这个减少的例子:

public class Person : IHasExtraItems { public Person() { this.ExtraItems = new HashSet(); } public virtual Guid Id { get; set; } public virtual string Name { get; set; } public virtual DateTime Birthdate { get; set; } public virtual ICollection ExtraItems { get; protected set; } } public class ExtraItem { public virtual Guid Id { get; set; } } 

而这个示例映射:

             

由于我希望能够透明地将此function应用于许多类 – 仅通过实现接口 – 我不想将“ExtraItem”放在映射中。 相反,我想在运行时添加它。 因此,如果我从xml映射中删除该属性,我该如何在运行时添加它?

这就是我正在尝试做出的改变的类型: http : //ayende.com/Blog/archive/2008/05/01/Dynamic-Mapping-with-NHibernate.aspx

但是它没有映射多对多的集合,而我的虚弱大脑已经无法破译nhibernate用来创建效果的内存映射表示。 这是我最接近的,基于尝试在调试器中显示匹配的属性

 foreach (var cls in cfg.ClassMappings) { if (typeof(IHasExtraItems).IsAssignableFrom(cls.MappedClass)) { NHibernate.Mapping.Property property = new NHibernate.Mapping.Property(); NHibernate.Mapping.Set value = new NHibernate.Mapping.Set(cls); value.Role = cls.EntityName + ".ExtraItems"; value.IsGeneric = true; var table = new Table(); table.Name = cls.MappedClass.Name + "ExtraItems"; value.CollectionTable = table; value.GenericArguments = new Type[] { typeof(ExtraItem) }; value.IsOptimisticLocked = true; value.IsLazy = true; mappings.AddCollection(value); property.Value = value; property.Name = "ExtraItems"; property.PersistentClass = cls; property.Cascade = "all"; cls.AddProperty(property); } } 

在测试中,这会产生运行时错误,因为键是null,但XML映射版本可以工作,并且在我进行更改时看起来或多或少相同。

奖励积分 :我想要一个多对多,因为我想要一个联合表。 这使我可以使用真正的外键将实体映射到扩展数据以提高性能。 ExtraItems应该是一个值类型而不是一个真实的实体,但我无法弄清楚如何映射它,即使在XML中也是如此。

奖励积分,第2部分:我可以使用confORM做到这一点吗? 我不想将所有现有映射切换到confORM,我找不到将confORM与传统XML映射混合的示例,无需修改现有映射。 流利将是另一种选择,但我使用NH3,我不认为Fluent支持。

提前致谢!

编辑我很确定我的问题是我没有定义集合的元素。 但是,我无法辨别如何正确定义集合的元素。

有NH3的流畅版本,所以你可以使用它(我这样做),如果你使用流利的话,你可以很容易地用惯例做到这一点。 你在奖励积分部分提到,所以也许你应该再看一眼?