4

Entity Framework 4.1 を使用して SQL データベース バックエンドに接続する IIS でホストされる WCF サービスがあります。時折、次の例外が発生します。

EdmType を CLR クラスに複数回マップすることはできません。EdmType 'Model.EmailTemplate' が複数回マップされています。(同じキーのアイテムが既に追加されています。)

これはめったに発生しないため、常に同じクラスであるかどうかはわかりませんが、上記のクラスに特別なことは何もなく、edmx に複数回表示されることはありません。(これは単に、Entity Framework を脱線させるようなことが起こった後にアクセスしようとした最初のクラスを非難しているだけだと思います。)

モデルはデザイナーを使用してデータベース テーブルから生成され、複雑なマッピングなどはありません。

これが発生すると、iisreset を実行するまでその例外をスローし続けます。その後、再起動すると完全に満足します。

私が知る限り、これは本番環境では発生していないようですが、開発環境とテスト環境の両方で発生しており、SQL サーバー インスタンスが異なる 2 つの環境で発生しています。どちらの場合も、iisreset を実行すると、次に問題が発生するまで消えます。

これがいつ発生し、何が原因であるかを確認するのに十分なほど、これを一貫して再現することはできません。しかし、私が考えることができる2つの可能性があります:

  • WCF サービスと win32 サービスは、同じアセンブリと構成ファイルを共有して、同じデータベースに接続します。2つの間のタイミングの何らかの時折の組み合わせがそれらの1つを悩ませている可能性があると思いますが、それらは異なるプロセスであり、異なる資格情報を使用しているため、それらが互いにどのように影響するかはわかりません...

  • を使用していくつかのストアド プロシージャを呼び出す 2 番目の別のデータベースと対話するポイントがありますSqlCommand.ExecuteReader。を呼び出すためだけに EF コンテキストをインスタンス化しますObjectContext.Translate<ResultSetType>(reader)。呼び出しがジェネリック パラメーターとして受け取る結果セットの型は、コンテキストでマップされる型ではなく (特に、上記の例外で言及されている型とは関係ありません)、単なる POCO です。また、適切な SqlDataReader が既にロールの準備ができているため、オブジェクト コンテキストがオンになっているのと同じデータベースに接続することさえありません。オブジェクト コンテキストは、エンティティを他のデータベースから自動的に変換する便利な方法として使用されます。(静的な場合、この呼び出しは静的になります。Translate<T>(DbDataReader)これはおそらくハックのようなものであり、おそらくそのように使用されることを認めないため、おそらくそれがつまずいているのです...しかし、ブロックは using でラップされています(TransactionScopeOption.Suppress using が直接その中にあります) 、したがって、後でインスタンス化された他のコンテキストで行われた後続の呼び出しにこの影響を与えるべきではないように感じます...

このようなことに遭遇したことのある人はいますか?

追加するために編集: これはMappingExceptionであり、スタックトレースは以下です。

at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection objectItemCollection, Assembly assembly, Boolean loadReferencedAssemblies, EdmItemCollection edmItemCollection, Action`1 logLoadMessage)
   at System.Data.Metadata.Edm.ObjectItemCollection.ImplicitLoadAssemblyForType(Type type, EdmItemCollection edmItemCollection)
   at System.Data.Metadata.Edm.MetadataWorkspace.ImplicitLoadAssemblyForType(Type type, Assembly callingAssembly)
   at System.Data.Objects.ELinq.ExpressionConverter.TryGetValueLayerType(Type linqType, TypeUsage&amp; type)
   at System.Data.Objects.ELinq.ExpressionConverter.GetCastTargetType(TypeUsage fromType, Type toClrType, Type fromClrType, Boolean preserveCastForDateTime)
   at System.Data.Objects.ELinq.ExpressionConverter.CreateCastExpression(DbExpression source, Type toClrType, Type fromClrType)
   at System.Data.Objects.ELinq.ExpressionConverter.ConvertTranslator.TranslateUnary(ExpressionConverter parent, UnaryExpression unary, DbExpression operand)
   at System.Data.Objects.ELinq.ExpressionConverter.UnaryTranslator.TypedTranslate(ExpressionConverter parent, UnaryExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)  
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.MemberInitTranslator.TypedTranslate(ExpressionConverter parent, MemberInitExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding&amp; binding)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression&amp; source, DbExpressionBinding&amp; sourceBinding, DbExpression&amp; lambda)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.Convert()
   at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable&lt;T&gt;.GetEnumerator()
   at System.Collections.ObjectModel.ObservableCollection`1.CopyFrom(IEnumerable`1 collection)
   at System.Collections.ObjectModel.ObservableCollection`1..ctor(IEnumerable`1 collection)
4

0 に答える 0