Добро пожаловать в Записки дилетанта Войти|Регистрация | Помощь
Ошибка "Bad key member" в Linq to SQL

До сей поры радующий меня Orcas таки показал свои зубки Smile. 2 часа были посвящены шаманским танцам с бубном вокруг чудесной ошибки "Bad key member: 0: User.UserId in [UserId]", но шаманство таки помогло и я смог побороть ситуацию Wink. Да и решение оказалось воистину простым...

Вообщем рассказываю по порядку. Есть схема из N различных связанных друг с другом таблиц. В дизайнере быстренько сгенерил классы для них, скомпилил на ура, пишу простейший тест на селект из одной таблицы - проходит на ура. Делаю селект из другой таблицы - и получаю в лоб вышеприведенную ошибку. Начинаю смотреть глубже и обнаруживаю, что все таблицы кромеэтой работают на ура, а любое обращение к классу "поломанной" таблицы дает ошибку. Пошел как нормальный человек гуглить, но по теме нашел аж 2 поста на MSDN-овсих форумах. Напрямую они не помогли, правда локализовали проблему - ошибка случается в случае проблем с настройками связей. И действительно - убираю из класса все ссылки на друие классы и все начинает работать, возвращаю ссылки назад - валится вусмерть. Мучался долго, действовал уже по принципу "а попробуем еще вот так, вдруг чего выйдет?" и таки нашел решение Smile. Оказывается у меня в одной таблице имя поля было задано как UserId, а в другой (в других вернее) - как UserID. Уж не знаю, если честно, что именно жить DLinq-у мешало, но исправление всех имен на UserID в соотв. атрибутах Association как в главной, так и в подчиненных таблицах таки помогло Wink.

Posted: Thursday, March 29, 2007 5:09 PM от Дмитрий Руденко
Метки (ключевые слова): , , ,

Комментарии:

Jcomp сказал:

Мдя ... а все никак выкачать Orcas не соберусь.

# March 29, 2007 9:52 AM

Max951 сказал:

А я вот выкачал

Что меня смутило:

1. Использование рефлексии:

Вот вызов ХП    

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

   [global::System.Data.Linq.StoredProcedure(Name="dbo.Customers_SelectAll")]

   public global::System.Collections.Generic.IEnumerable<Customers_SelectAll> Customers_SelectAll() {

       global::System.Data.Linq.Provider.IQueryResults<Customers_SelectAll> result = this.ExecuteMethodCall<Customers_SelectAll>(this, ((global::System.Reflection.MethodInfo)(global::System.Reflection.MethodInfo.GetCurrentMethod())));

       return ((global::System.Collections.Generic.IEnumerable<Customers_SelectAll>)(result));

   }

Есть серьёзные опасения что тормозить вся эта кухня будет жутко

2. Зачем генерить отдельный класс под каждый вызов ХП?

а если у меня Select_All должен возвращать List<Customer> - Ведь так по сути и должно быть.

А возвращает он мне IEnumerable<Customers_SelectAll> -

и чё у меня будет сотни классов под каждую ХП?

Вообщем круто, но пока я не в особом восторге

# March 30, 2007 4:02 PM

Max951 сказал:

Кстати по поводу отдельного класса на ХП я поторопился.

Просто перетащить ХП нужно было к классу.

# March 30, 2007 4:15 PM
Новые Комментарии отключены.