1

我正在研究遗留系统,并且正在将其移植到休眠状态。

该系统基于生成的“实体”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 的接口: public interface IOrder { public ICustomer Customer {get; 放;} ... }

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

简而言之:来自 NH 大师的任何提示将不胜感激。

4

1 回答 1

0

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

于 2012-06-18T15:22:06.753 回答