NHibernate - 在遗留系统中映射自定义引用类型

时间:2012-06-14 20:39:26

标签: nhibernate nhibernate-mapping

我正在研究遗留系统,我正在将它移植到nhibernate。

系统基于生成的“实体”C#类, 以及基于在特殊“链接”类中包装跨实体引用的数据访问基础结构。这是一种误导性的尝试来实现延迟加载,这实际上会伤害到它的帮助。

示例:

public class Order
{
    public Guid Id { get; protected set;}
    public int Total {get; set;}
    public Link<Customer> Customer {get; set;}
}

public class Customer
{
    public Guid Id { get; protected set;}
    public string Name {get; set;}
}

public class Link<T>
{
   ... Snip ...
   public T Entity { get; private set;}
}

在订单表中,“客户”列是标准外键。

这意味着在整个系统中,使用这些“实体”的任何工作都采用以下形式:

if (Order.Customer != null)
{
    if (Order.Customer.Entity != null)
    {
        // Do stuff
    }
}

经过大量研究,我找不到一种方法来映射这些类,以便能够合理地使用nhibernate的查询功能。 我找到的最接近的解决方案是 IPropertyAccessor 接口,这可能会解决我的映射问题,但对查询不会很好。

一些注意事项: 1)不幸的是,Link包装器类的主要问题仍然存在,我无法在不重写整个传统基础结构的情况下将其删除。 2)我可以完全访问代码生成模板,并且可以根据需要更改实体类结构。例如,为了解决不同的主要问题,我为每个实体生成了一个类似poco的界面:     公共接口IOrder     {         public ICustomer Customer {get;组;}         ...     }

public class Order : IOrder
{
    ...
    public Link<Customer> Customer {get; set;}
    ICustomer IOrder.Customer
    {
       (Adapting code here)
    } 
    ...
}

简而言之:非常感谢来自NH大师的任何提示。

1 个答案:

答案 0 :(得分:0)

由于我无法发表评论,我将分享可以帮助您解决问题的link,我认为您必须映射链接的所有可用用途,但您将有很多限制,因为这不是NHibernate的预期