Неоднозначная собственность на прокси NHibernate? - PullRequest
1 голос
/ 29 марта 2011

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

1 Ответ

0 голосов
/ 29 марта 2011

Поскольку вы не указываете IgnoreCase, я предполагаю, что ваше неоднозначное совпадение вызвано наследованием прокси.

Может быть, ваш локальный экземпляр имеет разные ленивые настройки, которые мешают загрузке объекта в качестве прокси-объекта?

(UserProxy49b5a83368564e9cbd22b8e2f0a0c5a7 указывает, что это прокси-объект)

Вы уверены, что правильно переопределяете член? Вы пробовали BindingFlags.DeclaredOnly? Мне интересно, пытается ли он также вернуть унаследованные члены, и именно поэтому вы получаете неоднозначное исключение совпадения.

...