указанное приведение материализованного типа «System.Guid» к типу «System.Int32» недопустимо

Указанное приведение из материализованного типа «System.Guid» к типу «System.Int32» недопустимо.

У нас есть несколько служб WCF с режимом параллелизма Multiple и InstanceContextModeSingle. Наша архитектура ориентирована на слабосвязанную модель с использованием внедрения зависимостей на основе конструктора. Это, в свою очередь, реализовано с помощью Unity 2.0 (web.config каждой службы имеет сопоставления между интерфейсами и типами, определенными в разделе контейнера единства). Одна из наших зависимостей — это сборка DAL (уровень доступа к данным), которая использует Entity Framework 4 для связи с сервером MSSql. Классы, которые взаимодействуют с базой данных, также включены в сопоставление единства.

Все отлично, когда мы запускаем наши интеграционные тесты. Но когда мы переходим к нашей среде производительности для запуска нагрузочных тестов (2, 3, 4 одновременных пользователя), мы начинаем видеть следующую ошибку:

System.InvalidOperationException: свойство auth_token в 'Session' не может быть установлено на Значение «Int32». Вы должны установить для этого свойства ненулевое значение типа «Guid».

Со следующим стеком:

at System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
at System.Data.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32 ordinal, String propertyName, String typeName)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
at System.Linq.Queryable.First[TSource](IQueryable`1 source)
at MISoa.DataAccessLayer.Authentication.AuthenticationDB.RetrieveSession(Guid authToken)
at MISoa.DataAccessLayer.Authentication.AuthenticationAccess.RetrieveSession(String sessionToken)

Вот метод-виновник:

public Session RetrieveSession(Guid authToken)
    {
        CheckDBContext();
        var sessions = (from r in _dbContext.Sessions
                where r.auth_token == authToken
                select r);
        return sessions.Count() > 0 ? sessions.First() : null;
    }

Метод CheckDBContextпросто проверяет, является ли контекст базы данных нулевым, и, если это так, выдает пользовательское исключение.

Объект сущности сеанса emdx имеет следующие общедоступные свойства:

Guid auth_token
DateTime time_stamp
String user_id
String app_id

Таким образом, похоже, что иногда приведенный выше linq возвращает некоторый другой объект из базы данных, где первый столбец представляет собой int, а не . ] руководство? А если так - то почему? Есть ли у меня проблема с несколькими потоками, переопределяющими контекст БД друг друга? Кстати, мы абстрагировали код, создающий контекст БД, в отдельный класс (BaseDB), который также обрабатывается единством. Итак, поскольку служба является одноэлементной, у меня есть один экземпляр BaseDB для всех, верно? Это проблема здесь?

О, еще кое-что. Нам сказали, что у нас будет MSSql 2005, поэтому в файле edmx у нас есть ProviderManifestToken="2005".Но я только что проверил, и сервер с нашей базой данных производительности версии 2008. Это проблема?

Спасибо за помощь.

14
задан Chris Barlow 11 May 2012 в 19:33
поделиться