【问题标题】:Ambiguous property on an NHibernate proxy?NHibernate 代理上的模糊属性?
【发布时间】:2011-07-25 00:57:16
【问题描述】:

当我尝试按名称获取属性时,我在 NHibernate 中遇到“发现不明确的匹配”异常。我正在尝试远程调试它,因为它不会发生在我的机器上,只发生在网络服务器上:/ 所以我随时吐出所有可见的属性,我得到了这个:

Failed to get property Id on UserProxy49b5a83368564e9cbd22b8e2f0a0c5a7!  
All properties: 
property: FirstName of type: System.String readable: True writable: True declared type: UserProxy49b5a83368564e9cbd22b8e2f0a0c5a7
... etc for other properties
property: Id of type: System.Nullable`1[System.Int32] readable: True writable: True declared type: UserProxy49b5a83368564e9cbd22b8e2f0a0c5a7
... etc for other properties
property: HibernateLazyInitializer of type: NHibernate.Proxy.ILazyInitializer readable: True writable: False declared type: UserProxy49b5a83368564e9cbd22b8e2f0a0c5a7
property: Id of type: System.Nullable`1[System.Int32] readable: True writable: True declared type: MyNamespace.ModelBase`1[System.Nullable`1[System.Int32]]

ModelBase 是定义“Id”的抽象基类,因此存在歧义。但是有两个问题困扰着我:怎么做?为什么不在我的机器上?我也与那些代理对象交互,从来没有模棱两可,但每次都会发生在服务器上。

这样的模棱两可怎么可能存在?我尝试将绑定标志更改为.Instance | .Public,但我仍然收到错误(并且我每次都会更改我的错误输出,所以它不仅仅是一个陈旧的二进制文件)。所以对象有两个相同类型和相同名称的属性,而.NET允许这样...?

要添加更多问题,我该如何解决这个问题,是否有人对远程调试有任何建议?我现在依靠异常并手动将信息添加到输出中,这几乎没有效率。

编辑:投掷线周围的确切代码:

PropertyInfo prop = null;
try {
    prop = root.GetType().GetProperty(props[0], BindingFlags.Instance | BindingFlags.Public); // props[0] == "Id"
}
catch (Exception e) {
    PropertyInfo[] allprops = null;
    allprops = root.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
    StringBuilder sb = new StringBuilder();
    foreach (PropertyInfo p in allprops)
        sb.Append("property: " + p.Name + " of type: " + p.PropertyType + " readable: " + p.CanRead + " writable: " + p.CanWrite + " declared type: " + p.DeclaringType);

    throw new Exception("Failed to get public property " + props[0] + " on " + root.GetType().FullName + "!  All: " + sb.ToString() + " Inner: " + e.Message + " inner stack: " + e.StackTrace, e);
}

【问题讨论】:

  • 可以给我们看看相关代码吗?
  • 当然可以 :) 可能一开始就应该这样做,谢谢提醒。

标签: .net nhibernate reflection remote-debugging


【解决方案1】:

由于您没有指定 IgnoreCase,我假设您的模棱两可的匹配是由代理继承引起的。

也许您的本地实例有不同的延迟设置,这会阻止实体作为代理对象加载?

(UserProxy49b5a83368564e9cbd22b8e2f0a0c5a7表示是代理对象)

您确定您正确地覆盖了该成员吗?您是否尝试过 BindingFlags.DeclaredOnly?我想知道它是否也尝试返回继承的成员,这就是您收到模糊匹配异常的原因。

【讨论】:

  • 我没有尝试过DeclaredOnly,我会尽快尝试。至于代理模仿的对象,它与其他十几个不会引起问题的类相同。另一个调用会返回列表中的用户,但这个调用有效。
  • 这确实解决了这个问题,谢谢!现在我失去了所有其他对象的“Id”属性,但是:/哦,好吧,我知道如何解决这个问题......
  • 是的。他们必须是,如果 any 不是,NHibernate 构建失败。
  • 你确实使用“覆盖”而不是“新”来扩展它在一个引起麻烦的类中?
  • 我根本不修改 Id 属性,它仅通过基类公开。这是在基础中声明的唯一属性。但是,我不能代表 NHibernate,而且我不确定从哪里开始查看该代码库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 2012-05-12
  • 2013-02-18
  • 2020-12-24
  • 1970-01-01
  • 2018-03-04
相关资源
最近更新 更多