我正在研究遗留系统,并且正在将其移植到休眠状态。
该系统基于生成的“实体”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 大师的任何提示将不胜感激。