Nhibernate不一致的抓取行为

时间:2017-04-09 10:17:48

标签: c# nhibernate

这是我的代码

if (des.X == null)
{
    if (src.IsL)
    {
        des.X = new Y();
        var l = lRepo.Find().Where(file => file.Id == src.drId).First();
        ((Y)des.X).L = l;
    }
    else
    {

        D d = dRepo.Get(src.DrugId);
        if (d is N)
        {
            des.X = new Y();
            ((Y)des.X).D = d;
            ((Y)des.X).L = ((N)d).L;
        }
        else
        if (d is IF)
        {
            des.X = new IeI();
            des.X.D = d;
        }
    }
}

当我问if (d is N)

时会发生问题

第一次发送创建请求并发送 N Id 时,它会将其评估为true,但是当我发送相同的数据进行更新时,它会将其评估为false。

我有点困惑,我没有合理的解释,所以任何人都可以帮我解决这个问题。

更新时会返回代理,但在创建时会返回正常的实体。

Untrack而不是延迟加载解决方案在这种情况下工作,但我不认为它们是有效的解决方案。

请帮助。

1 个答案:

答案 0 :(得分:1)

您可能正在获取映射基类的代理。它派生自基类,而不是来自您的具体类,导致您的类型测试失败。

如果没有关于您的模型的更多细节,我只能提出最坏的解决方案。 (最好避免处于必须根据预期的具体类型测试基类代理类型的情况。)

在您的基类中,添加:

public virtual Type GetUnproxiedType()
{
    return GetType();
}

将测试更改为:

if (typeof(NonInfantDrugRegistration).IsAssignableFrom(
    drugRegistration.GetUnproxiedType()))

这应该有效,因为NHibernate代理重定向对方法和属性的调用,除了属于对象类型的id和方法(以及其他一些)。它将调用重定向到具体的未复制实例,它将在第一次调用重定向时动态创建和加载。此具体实例将不是代理,并且具有预期的类型。因此,上面的GetUnproxiedType方法将重定向到未经过代理的NonInfantDrugRegistration,然后会返回您的具体类型。