这是我的代码
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而不是惰性加载解决方案有效,但我认为它们不是有效的解决方案。
请帮忙。
您可能正在获取映射基类的代理。它派生自基类,而不是具体类,导致类型测试失败。
如果没有关于您的模型的更多详细信息,我只能提出一个最坏情况的解决方案。(最好避免处于必须根据预期的具体类型测试基类代理类型的情况。
在基类中,添加以下内容:
public virtual Type GetUnproxiedType()
{
return GetType();
}
将测试更改为:
if (typeof(NonInfantDrugRegistration).IsAssignableFrom(
drugRegistration.GetUnproxiedType()))
这应该有效,因为 NHibernate 代理将调用重定向到方法和属性,但属于对象类型(和其他一些(的 id 和方法除外。它将调用重定向到具体的非代理实例,它将在第一次调用重定向时动态创建和加载。此具体实例将不是代理,并且具有预期的类型。因此,上面的GetUnproxiedType
方法将被重定向到一个无代理NonInfantDrugRegistration
,然后返回您的具体类型。