道歉,如果已经有一个点答案,但我还没有找到答案。我正在使用NH3,我有一个用例,我想在任何实体上添加一个Set实现一个特定的接口。我有一个配置构建器类,所以我可以在创建会话工厂之前进行这些更改。
鉴于这个简化的例子:
public class Person : IHasExtraItems
{
public Person()
{
this.ExtraItems = new HashSet<ExtraItem>();
}
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual DateTime Birthdate { get; set; }
public virtual ICollection<ExtraItem> ExtraItems { get; protected set; }
}
public class ExtraItem
{
public virtual Guid Id { get; set; }
}
这个示例映射:
<class name="Person">
<id name="Id">
<generator class="guid"/>
</id>
<property name="Name"/>
<property name="Birthdate"/>
<set name="Extra" table="PersonExtraItems" cascade="all">
<key column="PersonId"/>
<many-to-many column="ExtraItemId" class="ExtraItem" unique="true" />
</set>
</class>
因为我希望能够透明地将这个功能应用于许多类 - 只需实现接口 - 我不想在映射中放置“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映射混合的示例,无需修改现有映射。 Fluent是另一种选择,但我使用的是NH3,我认为Fluent还不支持。
提前致谢!
编辑我很确定我的问题是我没有定义集合的元素。但是,我无法辨别如何正确定义集合的元素。
答案 0 :(得分:1)
有NH3的流畅版本,所以你可以使用它(我这样做),如果你使用流利的话,你可以很容易地用惯例做到这一点。你在奖励积分部分提到,所以也许你应该再看看它?