это несколько сложно понять, я думаю, возможно, я что-то упустил.
Я новичок, пытающийся настроить базу данных, отображаемую через 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, пожалуйста, помогите! :)