繁体   English   中英

Nhibernate不一致的提取行为

[英]Nhibernate inconsistent fetching behavior

这是我的代码

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。

我有些困惑,对此我没有逻辑上的解释,因此任何人都可以帮助我解决此问题。

更新时,它返回一个代理,但是在创建时,它返回一个普通实体。

在这种情况下,不跟踪和非延迟加载解决方案都可以工作,但是我认为它们不是有效的解决方案。

请帮忙。

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

没有有关您的模型的更多详细信息,我只能提出最坏情况的解决方案。 (最好避免避免不得不针对预期的具体类型测试基类代理的类型。)

在您的基类中,添加以下内容:

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

将测试更改为:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM