OData在MVC3 + EF分层架构中

时间:2011-11-10 16:43:40

标签: wcf asp.net-mvc-3 entity-framework odata

我是WCF相关内容的全新手,所以请原谅我天真的问题,但我不知道在学习OData基础知识时,从哪里开始查明错误。

我有一个使用数据库的现有MVC3应用程序,使用通用成员资格提供程序(通过nuget添加)和通过SQL Server Compact Edition客户端数据提供程序4.0访问的小型SDF数据库。我用以下步骤创建了它:

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数据服务,更改生成代码的一些行,以及所有神奇的工作:)。所以我认为这与我的分层架构有关,特别是对于缺少的上下文警告。任何人都可以帮助在这样的分层场景中使用此服务吗?谢谢!

  

...值不能为空。参数名称:key    在System.Collections.Generic.Dictionary 2.FindEntry(TKey key) at System.Collections.Generic.Dictionary 2.get_Item(TKey key)at   System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMetadata(IDictionary 2 knownTypes, IDictionary 2个childTypes,IDictionary 2 entitySets) at System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata() at System.Data.Services.DataService 1.CreateProvider()at   System.Data.Services.DataService 1.HandleRequest() at System.Data.Services.DataService 1.ProcessRequestForMessage(流   messageBody)在SyncInvokeProcessRequestForMessage(Object,Object [],   对象[])在   System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象   实例,对象[]输入,对象[]&amp;输出)   System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&安培;   rpc)at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean   isOperationContextSet)   System.ArgumentNullException:值不能为null。   参数名称:键位于   System.Collections.Generic.Dictionary 2.FindEntry(TKey key) at System.Collections.Generic.Dictionary 2.get_Item(TKey key)at   System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMetadata(IDictionary 2 knownTypes, IDictionary 2个childTypes,IDictionary 2 entitySets) at System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata() at System.Data.Services.DataService 1.CreateProvider()at   System.Data.Services.DataService 1.HandleRequest() at System.Data.Services.DataService 1.ProcessRequestForMessage(流   messageBody)在SyncInvokeProcessRequestForMessage(Object,   Object [],Object [])at   System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象   实例,对象[]输入,对象[]&amp;输出)   System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&安培;   rpc)at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean   isOperationContextSet)...

1 个答案:

答案 0 :(得分:0)

这可能不是最好的解决方案,但这里是我如何设法与EF和WCF分层:

  1. 创建MVC应用程序项目。

  2. 创建一个新的Web应用程序项目,将您的实体模型和WCF服务添加到此项目中。编辑post build事件,将相关的dll从你的bin / / .svc文件复制到你的MVC项目。

  3. 创建您的图书馆项目,添加您的服务参考。从MVC应用程序中使用此库。确保在实例化上下文时使用MVC .svc文件的路径。