2

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 优化/差异的信息......

4

1 回答 1

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 实体。您只需将模板添加到您的项目中,并在设计器中将“代码生成策略”从“默认”更改为“无”。VS 代码库上有 VS2010 的 T4 模板,您可以使用它从设计器生成 POCO 实体。您只需将模板添加到您的项目中,并在设计器中将“代码生成策略”从“默认”更改为“无”。VS 代码库上有 VS2010 的 T4 模板,您可以使用它从设计器生成 POCO 实体。您只需将模板添加到您的项目中,并在设计器中将“代码生成策略”从“默认”更改为“无”。

于 2013-04-03T17:05:25.033 回答