MetadataException:在Release配置中使用ExecuteStoreQuery时指定的Schema无效

时间:2013-04-03 09:10:07

标签: c# entity-framework entity-framework-4

使用 ExecuteStoreQuery 检索当前数据库日期时,我收到以下异常:

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();

之前我使用过规范函数CurrentDateTime,但是在调试配置中也导致了这个异常。 现在只在发布配置中抛出

我发现这个确切的例外仅提到了几次,主要是它首先与混合代码相关,数据库第一次接近一个程序集,我相信我已经排除了这种情况。

生成的代码确实包含

[assembly: EdmSchemaAttribute()]

但我不知道是哪种类型引起的 - 我一无所知,也不知道如何找到它们。

如果我只使用LINQ to Entities,那一切似乎都有效。

目前,我依赖我们的服务器时间进行同步,并且根本不查询数据库时间 - 不建议这样做,但遗憾的是,在我们的代码库中首先不依赖它。

问题:

代码生成器包含所述属性的原因是什么?我怎么能防止这种情况?什么是合理的解决方法(导入包含SELECT GetDate()的存储过程似乎是一种矫枉过正的行为)?另外为什么这只发生在发布配置中?我没有找到基于编译器符号和选项的EF优化/差异信息......

1 个答案:

答案 0 :(得分:2)

历史上(在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实体。您只需将模板添加到项目中,并在设计器中将“代码生成策略”从“默认”更改为“无”。