簡體   English   中英

MVC3 + EF分層架構中的OData

[英]OData in MVC3 + EF layered architecture

我是WCF相關知識的新手,請原諒我的幼稚問題,但是我不確定從哪里開始在學習OData基礎知識時查明錯誤。

我有一個使用數據庫,使用通用成員資格提供程序(通過nuget添加)和通過SQL Server Compact Edition客戶端數據提供程序4.0訪問的小型SDF數據庫的現有MVC3應用程序。 我通過以下步驟創建了它:

1) 為數據層創建一個新的庫項目 ,從數據庫中添加EDMX,然后添加ADO.NET DB上下文和實體生成器模板。

2) 為通用數據接口創建一個新的庫項目 :在(1)中實現的存儲庫接口,並將帶有輸出的實體t4模板從(1)移到該項目中(更改TT inputFile參數,使其引用另一個項目中的EDMX)。

3)創建一個新的MVC應用程序 ,該應用程序使用Ninject實例化在(2)中聲明的通用存儲庫,並在(1)中實現基於SDF的存儲庫。

該Web應用程序運行正常,我可以查看和編輯數據。 現在,我應該通過WCF服務公開其某些功能,而我正在為此尋找OData。 因此,我添加了一個新的WCF數據服務,並更改了生成的代碼以對其進行測試,方法是添加我的實體類的名稱(如在(1)中實現的)和實體集的名稱,例如:

public class ProjectService : DataService<OrganizerEntities>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("Projects", EntitySetRights.AllRead);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    }
}

無論如何,當我在瀏覽器中打開SVC時,都會收到請求錯誤服務器在處理請求時遇到錯誤。 有關更多詳細信息,請參見服務器日志。 如果查看日志,首先會看到類似以下的警告:

... http://msdn.microsoft.com/it-IT/library/System.ServiceModel.EvaluationContextNotFound.aspx 找不到配置評估上下文 ...

然后是ArgumentNullException異常,其詳細信息如下。 在所有示例或教程中,我都看到了一個典型的非真實示例,其中數據層沒有與使用者應用程序分開:創建一個新的MVC應用程序,添加一個EDMX,添加一個WCF數據服務,更改生成的代碼的某些行,所有方法都可以神奇地工作:)。 因此,我想這與我的分層體系結構有關,尤其是對於缺少上下文警告的情況。 在這樣的分層方案中,有人可以幫助使用此服務嗎? 謝謝!

...值不能為null。 參數名稱:System.Collections.Generic.Dictionary 2.FindEntry(TKey key) at System.Collections.Generic.Dictionary鍵System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMetadata(IDictionary 2 knownTypes, IDictionary 2 entitySets) at System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata() at System.Data.Services.DataService (位於System.Data.Services.DataService 1.HandleRequest() at System.Data.Services.DataService位於System.Data.Services.DataService 1.HandleRequest() at System.Data.Services.DataService )的2 knownTypes, IDictionary 2 childTypes,IDictionary 2 entitySets) at System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata() at System.Data.Services.DataService 1.HandleRequest() at System.Data.Services.DataService 1.ProcessRequestForMessage(Stream MessageBody),位於SyncInvokeProcessRequestForMessage(Object,Object [],Object [],位於System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(對象實例,Object []輸入,Object []&輸出)在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&rpc)在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessa在System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&rpc) System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&rpc)處的ge41(MessageRpc&rpc)System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&rpc)處System.ServiceModel.Dispatcher.ImmutableDispatchRuntime。 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&rpc。 Boolean isOperationContextSet)System.ArgumentNullException:值不能為null。 參數名稱:System.Collections.Generic.Dictionary 2.FindEntry(TKey key) at System.Collections.Generic.Dictionary鍵System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMetadata(IDictionary 2 knownTypes, IDictionary 2 entitySets) at System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata() at System.Data.Services.DataService (位於System.Data.Services.DataService 1.HandleRequest() at System.Data.Services.DataService位於System.Data.Services.DataService 1.HandleRequest() at System.Data.Services.DataService )的2 knownTypes, IDictionary 2 childTypes,IDictionary 2 entitySets) at System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata() at System.Data.Services.DataService 1.HandleRequest() at System.Data.Services.DataService 1.ProcessRequestForMessage(Stream MessageBody),位於SyncInvokeProcessRequestForMessage(Object,Object [],Object [],位於System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(對象實例,Object []輸入,Object []&輸出)在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&rpc)在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessa在System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&rpc) System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&rpc)處的ge41(MessageRpc&rpc)System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&rpc)處System.ServiceModel.Dispatcher.ImmutableDispatchRuntime。 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&rpc。布爾值isOperationContextSet)...

這可能不是最好的解決方案,但是這是我設法通過EF和WCF進行分層的方法:

  1. 創建您的MVC應用程序項目。

  2. 創建一個新的Web應用程序項目,將您的實體模型和WCF服務添加到該項目中。 編輯構建后事件,以將bin / .svc文件中的相關dll復制到MVC項目中。

  3. 創建您的庫項目,添加您的服務引用。 在您的MVC應用中使用此庫。 實例化上下文時,請確保使用MVC .svc文件的路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM