2013-04-03 43 views
2

,我發現了以下異常使用ExecuteStoreQuery當檢索當前數據庫中指定日期的架構是無效的:MetadataException:在發佈配置使用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優化/差異的信息...

+0

你確定在用'SELECT GetDate()'替換'CurrentDateTime'後做了一個發佈版本嗎?我問,因爲我可以在調試和發佈版本中運行您的查詢(EF ** 5 ** db第一)。 –

+0

是的,它是100%的發佈版本,我也可以每次重現它。我認爲調用本身不是問題,在同一個程序集中似乎與LINQ to Entities或其他數據庫訪問方法存在某種衝突,但我不知道在哪裏尋找,究竟是什麼原因。 –

回答

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實體。您只需將模板添加到您的項目中,並在設計器中將「代碼生成策略」從「默認」更改爲「無」。

+0

我曾經想過早些時候使用POCO實體,儘管它有相當多的工作(我不知道所有可能發生的變化或失敗,大約有40個實體在70多個項目中使用),但可能是最終重新使用POCO實體的時候了。生成整個模型。我明天會做一些研究,謝謝你提醒我。 –

相關問題