В 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);
}