2013-01-01 51 views
0

我想允许第三方代码在运行时扩展NHibernate映射。 这是我现在有:在运行时扩展NHibernate查询

SQL:

TABLE Orders 
    Id INT identity, 
    [more fields...] 

代码在我的项目:

public interface IOrder 
{ 
    int Id { get; set; } 
    // more properties... 
} 

internal class Order : IOrder 
{ 
    public int Id { get; set; } 
} 

public class OrderDAL 
{ 
    public IEnumerable<IOrder> GetOrders() 
    { 
     ICriteria criteria; 
     // build some criteria 
     var result = criteria.List<Order>(); 
     RaiseOrdersLoaded(result); 
     return result; 
    } 
} 

的NHibernate HBM文件:

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="..." assembly="..."> 
    <class name="Order" table="Orders"> 
    <id name="Id" column="Id" type="int" > 
     <generator class="identity" /> 
    </id> 
    [more properties...] 
    </class> 
</hibernate-mapping> 

第三方是我加载Ioc的dll。它知道接口IOrder,但不知道类Order。它的开发者也在我的数据库添加表:

TABLE OrderExtension 
    OrderId PK, FK from Orders 
    CustomField nvarchar 

现在第三方开发者应该能够做到:

  1. 加入他的CustomField到查询中GetOrders。我想在运行时扩展hbm文件,但我不知道如何。
  2. 将查询条件添加到查询中,以按照他的CustomField进行过滤。
  3. 收听OrdersLoaded事件并以某种方式获取他的数据。

这一切可能吗?

感谢

回答

1

你可以把命名查询的映射,但这些将是SQL: http://nhibernate.info/doc/nh/en/index.html#querysql-namedqueries

您也可以在映射定义过滤器,将获得注入到其他类型的查询: http://nhibernate.info/doc/nh/en/index.html#filters

至于标准,Queryover,HQL和LINQ查询,你可以建立你的订单类喜欢的任何结构,以使其能够通过一些插件可以调用初始化方法来配置。

+0

谢谢你的回答。随着我方发展的进展,我需要彻底改变我的问题。我会再问一次,希望你能帮助我。 –

+0

这是我的新问题http://stackoverflow.com/questions/14134066/initialize-associated-entity-or-collection-fails-with-stateless-session-in-nhibe –