4

我有一个 IIS 托管的 WCF 服务,它使用 Entity Framework 4.1 连接到 SQL 数据库后端。有时,我会收到以下异常:

一个 EdmType 不能多次映射到 CLR 类。EdmType 'Model.EmailTemplate' 被多次映射。(已添加具有相同密钥的项目。)

这种情况很少发生,我不确定它是否总是同一个类,但上面提到的类绝对没有什么特别之处,而且它肯定不会不止一次地出现在 edmx 中!(我相信它只是归咎于它试图访问的第一个类,无论发生什么让实体框架脱轨。)

该模型是使用设计器从数据库表中生成的,没有任何复杂的映射或任何东西。

发生这种情况时,它将继续抛出该异常,直到我执行 iisreset,然后当它恢复时,它会非常高兴。

据我所知,这似乎并没有在生产中发生,但它在开发和测试中都发生了,这两个不同的环境具有不同的 SQL 服务器实例。在这两种情况下,执行 iisreset 都会让它消失,直到下一次被冒犯。

我无法始终如一地重现这一点,以确定它何时发生以及是什么原因造成的。但是,我能想到两种可能的事情:

  • WCF 服务和 win32 服务共享相同的程序集和配置文件以连接到相同的数据库。我想它们两者之间的某种偶然时间组合可能会让其中一个烦恼,但它们是不同的过程并使用不同的凭据,所以我不确定它们如何相互影响......

  • 有一点它与第二个单独的数据库通信,在该数据库上它使用SqlCommand.ExecuteReader. 它实例化一个 EF 上下文只是为了调用ObjectContext.Translate<ResultSetType>(reader). 调用作为泛型参数的结果集类型不是在上下文中映射的类型(尤其与上述异常中提到的类型无关),它们只是 POCO。它们甚至也没有连接到对象上下文打开的同一个数据库,因为适当的 SqlDataReader 已经准备好滚动。对象上下文仅用作自动翻译来自其他数据库的实体的便捷方式。(如果是静态的,则此调用将是静态的Translate<T>(DbDataReader)存在。)这可能是它的绊脚石,因为它有点像黑客并且可能不喜欢以这种方式使用......但是该块被包装在 using 中(其中直接使用 TransactionScopeOption.Suppress 使用) ,所以我仍然觉得它不应该对使用稍后实例化的其他上下文进行的后续调用产生这种影响......

有人遇到过这样的事情吗?

编辑添加: 它是一个 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