2011-02-04 102 views
4

道歉,如果有一个在线答案已经出现在那里,但我还没有找到它。我使用NH3,并且我有一个用例,我想将Set添加到任何实现类的实现特定接口的实体中。我有一个配置生成器类,所以我可以在创建会话工厂之前进行这些更改。在运行时扩展/修改NHibernate类

鉴于这种减少的例子:

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,并且我找不到将传统XML映射混合使用的示例,从不修改现有映射。 Fluent将是另一种选择,但我使用NH3,但我不认为Fluent支持。

在此先感谢!

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

回答

1

有NH3流利的构建,所以你可以使用它(我这样做),如果你使用流利你可以很容易地做到这一点与一个约定。你在奖励积分部分提到,或许你应该再看一次?