LINQ InvalidCastException error - PullRequest
       4

LINQ InvalidCastException error

3 голосов
/ 19 января 2010

Я получаю «InvalidCastException» (произошло в System.Data.Linq.dll) в моей функции:

public User GetUserByKey(Guid key)
{
            return usersTable.FirstOrDefault(m => m.UserKey == key);
}

который называется здесь:

MembershipUser mu = Membership.CreateUser(user.UserName, user.Password, user.Email, null, null, true, Guid.NewGuid(), out status);
User new_user = _UsersRepository.GetUserByKey((Guid)mu.ProviderUserKey);

mu.ProviderUserKey - объект Guid, инкапсулированный в общий тип объекта, поэтому все должно быть в порядке: /

Спасибо за вашу помощь!

Ответы [ 4 ]

1 голос
/ 19 января 2010

Так как вы упомянули, что это nvarchar(100) в вашем комментарии ранее, попробуйте это:

Guid key = new Guid(mu.ProviderUserKey.ToString()); // object to string
User new_user = _UsersRepository.GetUserByKey(key);

Кроме того, SQL Server имеет тип данных uniqueidentifier для представления GUID, который Вы можете рассмотреть возможность использования .

0 голосов
/ 19 января 2010

Возможно, я здесь не в базе, но вы создаете MembershipUser, и из вашего метода вы возвращаете пользователя.

Это так задумано, потому что если два не совпадают, вы получите ошибку приведения.

Попробуйте вернуть MembershipUser и посмотрите, поможет ли это.

0 голосов
/ 19 января 2010

Быстрый и простой способ сказать, чтобы понять это; Наведите курсор мыши на поле и убедитесь, что это проводник. Для безопасного хранения вы можете рассмотреть возможность использования Guid.TryParse для безопасной передачи значения, если оно является GUID, для предотвращения возникновения этой ошибки. В базовой базе данных он использует строковое значение, и я не знаю, есть ли какое-либо встроенное преобразование, или вам нужно преобразовать, используя Guid.Parse или Guid.TryParse.

НТН.

0 голосов
/ 19 января 2010

Недопустимое исключение приведения происходит почти всегда из-за неправильного отображения в классе назначения (User здесь).

Проверьте трассировку стека, чтобы увидеть, каков тип назначения, что должно помочь вам сузить, какие свойства посмотреть. Скорее всего, что-то изменилось в схеме базы данных, и сущность Linq не была обновлена.

Изменить - ошибка также может происходить при приведении ProviderUserKey к Guid - вы говорите, что Guid помечены как object, но это может быть не так (это может быть null например). Вы пытались войти в систему с помощью отладчика и посмотреть, каков реальный тип времени выполнения?

...