我正在研究遗留系统,我正在将它移植到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大师的任何提示。