Linq to SQL InvalidCastException - PullRequest
       5

Linq to SQL InvalidCastException

0 голосов
/ 03 января 2012

это несколько сложно понять, я думаю, возможно, я что-то упустил. Я новичок, пытающийся настроить базу данных, отображаемую через Linq-to-SQL, на мой сервер. Клиентами вызывается функция, которая извлекает учетную запись пользователя из базы данных:

public static explicit operator Dictionary<byte, object>(UserAccount a)
    {
        Dictionary<byte, object>  d = new Dictionary<byte, object>();
        d.Add(0, a.AuthenticationDatas.Username);
        int charCount = a.Characters.Count;
        for (int i = 0; i < charCount; i++)
        {
            d.Add((byte)(i + 1), (Dictionary<byte, object>)a.Characters[i]);
        }
        return d;
    }

На самом деле это преобразование типа UserAccount в тип моего сервера Dictionary. Сам UserAccount извлекается из базы данных и затем конвертируется с помощью этой функции.

Однако, когда я запускаю эту функцию, я получаю InvalidCastException в строке:

int charCount = a.Characters.Count;

Более того, когда точки останова VS @ этой линии, я могу подождать несколько секунд и продолжить, и исключение исчезнет! После этого он корректно получает символы. Количество.

Вот мое отображение персонажей:

[global::System.Data.Linq.Mapping.AssociationAttribute(Name="UserAccount_Character", Storage="_CharactersTBs", ThisKey="UID", OtherKey="UID")]
    public EntitySet<Character> Characters
    {
        get
        {
            return this._Characters;
        }
        set
        {
            this._Characters.Assign(value);
        }
    }

Я полагаю, что происходит то, что запрос каким-то образом выполняется в другом потоке, а не в том, который взаимодействует с базой данных, и выдает ошибку, прежде чем база данных сможет действительно получить таблицу символов. Я не совсем уверен ...

Кто-нибудь знает, в чем может быть проблема и как ее можно синхронизировать (без добавления задержки gimp)?

EDIT:

Хорошо, я сузил проблему. Это не имеет никакого отношения к различным сетям потоков или что-то еще ... Это просто я, будучи глупым. Вот простой запрос к базе данных, который выдает InvalidCastException @ line int count = UA.Characters.Count;

static void Main(string[] args)
    {           

        IEnumerable<UserAccount> query = from p in PBZGdb.Instance.AuthenticationDatas
                                         where p.Username == "Misha" && p.Password == "123"
                                         select p.UserAccount;
        UserAccount UA = query.ElementAt(0);
        int count = UA.Characters.Count;
        Console.WriteLine(count);
        Console.ReadKey();
    }

(p.s.) UA не равен NULL, он действительно находит правильный экземпляр userAccount и имеет 2 символа. Если я подожду несколько секунд и попробую еще раз, исключение исчезнет .. Что я делаю неправильно? Это первый раз, когда я действительно использую базу данных в VS, пожалуйста, помогите! :)

Ответы [ 2 ]

1 голос
/ 05 января 2012

Эй, просто хочу, чтобы кто-нибудь, имеющий такую ​​же проблему, знал, я понял это.Произошло то, что я вручную переименовал файл LINQ .dbml, когда добавил его в свой проект после того, как он был создан sqlmetal.И, конечно, я сделал это непоследовательно (он был переименован в дизайнере, но не в его файле .cs).Я только что заново сгенерировал новый файл .dbml с sqlmetal с правильным именем, и все работает как масло!

Спасибо, ребята!

1 голос
/ 03 января 2012

Похоже, что вы столкнулись с проблемой с отложенным выполнением EntitySet.Простой способ проверить это и, возможно, обойти его, состоит в том, чтобы попытаться вызвать метод .Count() вместо доступа к свойству .Count.

Вы можете просмотреть отладчик, как только вы нажметеи посмотрите на значение a.Characters.IsDeferred.


edit

Еще одна вещь, которую вы можете попробовать, - принудительно выполнить запрос с помощьюнеявно вызывая его .GetEnumerator() (и связанный .MoveNext()), заменив цикл на foreach:

int i = 0;
foreach (var character in a.Characters)
{
    d.Add( /* ... */ );
    ++i;
}

двойное редактирование

удаленокомментарий о

d.Add((byte)(i + 1), (Dictionary<byte, object>)a.Characters[i]);

после уточнения в комментариях ниже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...