【问题标题】:Extending NHibernate queries in run time在运行时扩展 NHibernate 查询
【发布时间】:2016-01-11 03:52:18
【问题描述】:

我想允许第 3 方代码在运行时扩展 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>

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

TABLE OrderExtension
    OrderId PK, FK from Orders
    CustomField nvarchar

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

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

这一切都可能吗?

谢谢

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    您可以将命名查询放入映射中,但这些将在 SQL 中: http://nhibernate.info/doc/nh/en/index.html#querysql-namedqueries

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

    对于 Criteria、Queryover、HQL 和 LINQ 查询,您可以在 Orders 类中构建您喜欢的任何构造,以便通过插件可以调用的一些初始化方法进行配置。

    【讨论】:

    猜你喜欢
    • 2015-05-02
    • 2010-11-12
    • 1970-01-01
    • 2013-10-14
    • 2020-07-23
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多