在运行时扩展/修改NHibernate类

4
抱歉如果已经有一个恰当的答案,但我还没有找到它。我正在使用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);
    }
}

在测试中,由于键为空,这会产生运行时错误,然而XML映射版本可以工作,并且在我进行更改时看起来几乎相同。
额外加分:我想要一个多对多的关系,因为我想要一个连接表。这让我可以使用真正的外键将实体映射到扩展数据以提高性能。ExtraItems应该是一个值类型而不是一个真正的实体,但我无法弄清楚如何映射它,即使在XML中也是如此。
额外加分,第二部分:我能用confORM做到这一点吗?我不想将所有现有的映射都切换到confORM,而且我找不到混合confORM和传统XML映射的示例,更不用说修改现有映射了。Fluent是另一个选择,但我正在使用NH3,我不认为Fluent支持它。
提前感谢!
编辑:我相当确定我的问题是我没有定义集合的元素。然而,我无法确定如何正确地定义集合的元素。
1个回答

1

有针对NH3的Fluent版本,所以你可以使用它(我在用),如果你正在使用Fluent,你可以很容易地通过一种约定来实现这一点。你在奖励分数部分提到了这一点,也许你应该再看一下?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接