2013-01-01 78 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 –