我有一个IIS托管的WCF服务,它使用Entity Framework 4.1连接到SQL数据库后端。偶尔,我会收到以下例外:
EdmType无法多次映射到CLR类。该 EdmType'Model.EmailTemplate'被映射多次。 (带有的项目 已经添加了相同的密钥。)
这种情况很少发生,我不确定它是否总是同一个类,但是上面提到的类肯定没什么特别的,它绝对不会出现在edmx中不止一次! (我相信它只会归咎于它试图访问的第一个类,无论发生什么事情都会导致实体框架脱轨。)
使用设计器从数据库表生成模型,并且没有任何复杂的映射或任何内容。
当发生这种情况时,它将继续抛出异常,直到我执行iisreset,然后当它恢复时,它非常高兴。
据我所知,这似乎并没有在生产中发生,但它在dev和test中都发生过,两个不同的环境都有不同的SQL服务器实例。在这两种情况下,做一个iisreset会让它消失,直到下次它被冒犯。
我无法始终如一地重现这一点,以确定它何时发生以及导致它的原因。但是,我可以想到两件事:
WCF服务和win32服务共享相同的程序集和配置文件以连接到同一数据库。我想有可能偶尔将两者之间的时序组合起来令人讨厌其中一个,但它们是不同的进程并使用不同的凭据,因此我不确定它们是如何相互影响的......
有一点与第二个单独的数据库进行通信,在该数据库上使用SqlCommand.ExecuteReader
调用某些存储过程。它只是为了调用ObjectContext.Translate<ResultSetType>(reader)
而实例化一个EF上下文。调用作为通用参数的结果集类型不是在上下文中映射的类型(特别是与上面例外中提到的类型无关),它们只是POCO。它们甚至都没有连接到对象上下文所在的同一个数据库,因为适当的SqlDataReader已经准备就绪了。对象上下文仅用作从其他数据库自动转换实体的便捷方式。 (如果存在静态Translate<T>(DbDataReader)
,这个调用将是静态的。)这可能是它的绊倒,因为它有点像黑客并且可能不喜欢被这样使用...但是块被包裹了在一个使用中(使用直接在其中使用的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& 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& binding)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& 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<T>.GetEnumerator()
at System.Collections.ObjectModel.ObservableCollection`1.CopyFrom(IEnumerable`1 collection)
at System.Collections.ObjectModel.ObservableCollection`1..ctor(IEnumerable`1 collection)