The specified cast from a materialized 'System.Guid' type to the 'System.Int32' type is not valid.
「可能System.Int32」タイプが有効でない
にマテリアライズド「可能System.Guid」タイプから指定されたキャストたちは、同時実行複数のモードとシングルのInstanceContextMode
を持っているいくつかのWCFサービスを持っています。私たちのアーキテクチャは、コンストラクタベースの依存性注入を使用する疎結合モデルに焦点を当てています。これはUnity 2.0を使用して実装されます(各サービスのweb.configには、単一のコンテナセクションで定義されたインタフェースとタイプの間のマッピングがあります)。依存関係の1つは、Entity Framework 4を使用してMSSql Serverと通信するDALアセンブリ(データアクセスレイヤー)です。データベースとの会話を行うクラスも、統一マッピングに含まれています。
統合テストを実行するとすべてが素晴らしいです。しかし、我々は、我々は次のエラー見始める負荷テスト(2、3、4同時ユーザ)を実行するために私たちのパフォーマンス環境に移行する場合:ここで
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)
:以下スタックと
System.InvalidOperationException: The 'auth_token' property on 'Session' could not be set to a 'Int32' value. You must set this property to a non-null value of type 'Guid'.
を犯人の方法である:
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
方法は、単純にそれがあるならば、それはカスタムEXCEPをスローし、デシベルコンテキストがnullであるかどうかをチェックし、 。時々、上記のLINQは、最初の列はint
ないあるデータベースから、いくつかの他のオブジェクトを返すように
Guid auth_token
DateTime time_stamp
String user_id
String app_id
だから、それが見えます:
emdxセッションエンティティ・オブジェクトは、これらのパブリックプロパティを持っていますか?もしそうなら - なぜ?お互いのdbコンテキストをオーバーライドする複数のスレッドに問題がありますか? BTW - dbコンテキストをインスタンス化するコードを抽象化して、別個のクラス(BaseDB)にしました。これも1で処理されます。だから、サービスはシングルトンなので、皆のために1つのBaseDBインスタンスを持っていますよね?これはここの問題ですか?
もう、もう1つ。私たちはMSSql 2005を持っていると言われましたので、edmxファイルにはProviderManifestToken="2005"
があります。しかし、私はちょうど確認し、私たちのパフォーマンスデータベースを持つサーバーはバージョン2008です。これは問題ですか?
ありがとうございました。
私が確認する最初の簡単なこと:auth_tokenはあなたのデータベースのGuidですか?エラーは何かがsession.auth_tokenをintに設定しようとしていることを示しています。正しくマップされていないint ID列はありますか?SQLプロファイリングトレースを行い、実際に行われたSQL呼び出しを識別できますか?私は本当にここであなたの問題を引き起こしているマルチスレッドを疑う。 –
データベース内の列が対応するプロパティタイプであることを確認してください。例外は、DbDataReaderはGuidを読み込みますが、クラスのプロパティはintであると言います。 – Pawel