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したことがありますが、デバッグ構成でもこの例外が発生しました。現在は release config でのみスローされます。

この正確な例外が数回しか言及されていないことがわかりました。ほとんどの場合、1 つのアセンブリでコード ファーストとデータベース ファーストのアプローチが混在していることに関連していましたが、私の場合は除外したと思います。

生成されたコードには実際に

[assembly: EdmSchemaAttribute()]

しかし、どのタイプがそれを引き起こしたのかわかりません-私は何も知らず、それらを見つける方法も知りません.

LINQ to Entities のみを使用すると、すべてうまくいくようです。

当分の間、私はサーバー時刻が同期されていることに依存しており、DB 時刻をまったくクエリしていません。

そして質問:

コード ジェネレーターが前述の属性を含める原因は何ですか? どうすればそれを防ぐことができますか? 合理的な回避策は何ですか (ストアド プロシージャをインポートする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 エンティティの検索が妨げられます)。最後に、デザイナーから POCO エンティティを生成するために使用できる VS コード ギャラリーの VS2010 用の T4 テンプレートがあります。テンプレートをプロジェクトに追加し、デザイナーで「コード生成戦略」を「デフォルト」から「なし」に変更するだけです。デザイナーから POCO エンティティを生成するために使用できる VS コード ギャラリーには、VS2010 用の T4 テンプレートがあります。テンプレートをプロジェクトに追加し、デザイナーで「コード生成戦略」を「デフォルト」から「なし」に変更するだけです。デザイナーから POCO エンティティを生成するために使用できる VS コード ギャラリーには、VS2010 用の T4 テンプレートがあります。テンプレートをプロジェクトに追加し、デザイナーで「コード生成戦略」を「デフォルト」から「なし」に変更するだけです。

于 2013-04-03T17:05:25.033 に答える