C# MetadataException:在版本配置中使用ExecuteStoreQuery时,指定的架构无效

C# MetadataException:在版本配置中使用ExecuteStoreQuery时,指定的架构无效,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,使用检索当前数据库日期时出现以下异常: The types in the assembly 'XYZ' cannot be loaded because the assembly contains the EdmSchemaAttribute, and the closure of types is being loaded by name. Loading by both name and attribute is not allowed. at System.Data.Metadata

使用检索当前数据库日期时出现以下异常:

The types in the assembly 'XYZ' cannot be loaded because the assembly contains
the EdmSchemaAttribute, and the closure of types is being loaded by name.
Loading by both name and attribute is not allowed.
   at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(
       ObjectItemCollection objectItemCollection, Assembly assembly,
       Boolean loadReferencedAssemblies, EdmItemCollection edmItemCollection,
       Action`1 logLoadMessage)
   at System.Data.Metadata.Edm.MetadataWorkspace.ImplicitLoadAssemblyForType(
       Type type, Assembly callingAssembly)
   at System.Data.Objects.ObjectContext.ExecuteStoreQueryInternal[TElement](
       String commandText, String entitySetName, MergeOption mergeOption,
       Object[] parameters)
   at (my method)
其中所讨论的方法包含

var timestamp = context.ExecuteStoreQuery<DateTime>("SELECT GetDate() ").First();
但我不知道是哪种类型导致了这种情况——我不知道,也不知道如何找到它们

如果我只使用LINQ来创建实体,这一切似乎都是可行的

目前,我依赖于服务器时间的同步,根本不查询数据库时间——不建议这样做,但遗憾的是,在我们的代码库中,这并不是第一件要依赖的事情

问题:


代码生成器包含所述属性的原因可能是什么?我怎样才能防止呢?什么是合理的解决方法(导入包含
SELECT GetDate()
的存储过程似乎有些过分)?为什么这只发生在版本配置中?我没有发现关于基于编译器符号和选项的EF优化/差异的信息…

历史上(在EF1中)EF只能使用从EntityObject类派生的实体,并具有无数属性-例如,每个实体都必须具有EdmEntityType属性,每个属性都必须具有EdmProperty属性等等。具有实体的程序集必须具有EdmSchemaAttribute。加载类型时,EF会查找EdmSchemaAttribute,如果找到它,它会知道此程序集包含需要加载的基于EntityObject的实体。在EF4中,添加了对POCO类型的支持。现在,您不必再拥有任何属性,并且按照约定将类型与模型匹配。但是,限制是不能混合POCO和非POCO类型(因此会出现异常)。VS2008 SP1和VS2010中的默认代码生成器生成基于EntityObject的实体和基于ObjectContext的上下文。存在非POCO实体,为了使EF能够找到它们,添加了EdmSchemaAttribute。在VS2012中,默认情况是生成POCO实体,而不会生成EdmSchemaAttribute(这实际上会阻止查找POCO实体)。最后,VS代码库上有VS2010的T4模板,您可以使用它们从设计器生成POCO实体。您只需将模板添加到项目中,并在设计器中将“代码生成策略”从“默认”更改为“无”。

您确定在将CurrentDateTime替换为SELECT GetDate()后进行了发布生成吗?我这样问是因为我可以在调试和发布版本中运行您的查询(EF5DB优先)。是的,这是100%的发布版本,我也可以每次都复制它。我认为调用本身不是问题所在,似乎与同一程序集中的LINQ to实体或其他DB访问方法存在某种冲突,但我不知道应该在哪里查找,确切的原因可能是什么。我以前曾想过使用POCO实体,尽管这是一项相当多的工作(我不知道所有可能发生的变化或故障,大约有40个实体在70多个项目中使用)可能是时候重新生成整个模型了。我明天会做一些研究,谢谢你提醒我。
[assembly: EdmSchemaAttribute()]