【问题标题】:NHibernate - Mapping custom reference types in legacy systemNHibernate - 在遗留系统中映射自定义引用类型
【发布时间】:2012-06-14 20:39:26
【问题描述】:

我正在研究遗留系统,并且正在将其移植到 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 { 公共 ICustomer 客户 {get;放;} ... }

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

简而言之:我们将不胜感激任何来自 NH 大师的建议。

【问题讨论】:

    标签: nhibernate nhibernate-mapping


    【解决方案1】:

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

    【讨论】:

    • 不要忘记分享您对当前问题状态的更新 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2010-12-25
    • 2019-01-25
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多