Entity framework 属性设置器为内部时ADO.NET Data Services实体框架请求错误

Entity framework 属性设置器为内部时ADO.NET Data Services实体框架请求错误,entity-framework,service,ado.net,Entity Framework,Service,Ado.net,当使用实体框架数据模型公开ADO.NET数据服务时,我收到一条错误消息,该数据模型包含一个实体(称为“Case”),该实体在属性上具有内部setter。如果我将setter修改为public(使用实体设计器),那么数据服务可以正常工作 我不需要在数据服务中公开实体“Case”,因此我尝试使用SetEntitySetAccessRule限制公开哪些实体。这不起作用,服务端点失败并出现相同的错误 public static void InitializeService(IDataServiceCon

当使用实体框架数据模型公开ADO.NET数据服务时,我收到一条错误消息,该数据模型包含一个实体(称为“Case”),该实体在属性上具有内部setter。如果我将setter修改为public(使用实体设计器),那么数据服务可以正常工作

我不需要在数据服务中公开实体“Case”,因此我尝试使用SetEntitySetAccessRule限制公开哪些实体。这不起作用,服务端点失败并出现相同的错误

public static void InitializeService(IDataServiceConfiguration config)
{
    config.SetEntitySetAccessRule("User", EntitySetRights.AllRead);
}
调用.svc终结点时,浏览器会报告错误消息。它是非常通用的,读作“请求错误。服务器在处理请求时遇到错误。有关详细信息,请参阅服务器日志”。遗憾的是,系统和应用程序事件日志中没有条目

我发现这一点显示了如何在服务上配置跟踪。执行此操作后,跟踪日志中报告了以下NullReferenceExceptoin错误

是否有人知道在包含具有内部setter的实体时如何避免此异常

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>131076</EventID>
<Type>3</Type>
<SubType Name="Error">0</SubType>
<Level>2</Level>
<TimeCreated SystemTime="2008-11-05T22:30:44.1523578Z" />
<Source Name="System.ServiceModel" />
<Correlation ActivityID="{da77ee97-960f-4275-a5e7-a181c0b024b1}" />
<Execution ProcessName="WebDev.WebServer" ProcessID="6388" ThreadID="8" />
<Channel />
<Computer>MOTOJIM</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Error">
<TraceIdentifier>http://msdn.microsoft.com/en-US/library/System.ServiceModel.Diagnostics.TraceHandledException.aspx</TraceIdentifier>
<Description>Handling an exception.</Description>
<AppDomain>685a2910-19-128703978432492675</AppDomain>
<Exception>
<ExceptionType>System.NullReferenceException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message>Object reference not set to an instance of an object.</Message>
<StackTrace>
at System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMemberMetadata(ResourceType resourceType, MetadataWorkspace workspace, IDictionary`2 entitySets, IDictionary`2 knownTypes)
at System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMetadata(IDictionary`2 knownTypes, IDictionary`2 entitySets)
at System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata()
at System.Data.Services.DataService`1.CreateProvider(Type dataServiceType, Object dataSourceInstance, DataServiceConfiguration&amp; configuration)
at System.Data.Services.DataService`1.EnsureProviderAndConfigForRequest()
at System.Data.Services.DataService`1.ProcessRequestForMessage(Stream messageBody)
at SyncInvokeProcessRequestForMessage(Object , Object[] , Object[] )
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&amp; rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&amp; rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&amp; rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&amp; rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
</StackTrace>
<ExceptionString>System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMemberMetadata(ResourceType resourceType, MetadataWorkspace workspace, IDictionary`2 entitySets, IDictionary`2 knownTypes)
   at System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMetadata(IDictionary`2 knownTypes, IDictionary`2 entitySets)
   at System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata()
   at System.Data.Services.DataService`1.CreateProvider(Type dataServiceType, Object dataSourceInstance, DataServiceConfiguration&amp; configuration)
   at System.Data.Services.DataService`1.EnsureProviderAndConfigForRequest()
   at System.Data.Services.DataService`1.ProcessRequestForMessage(Stream messageBody)
   at SyncInvokeProcessRequestForMessage(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</ExceptionString>
</Exception>
</TraceRecord>
</DataItem>
</TraceData>
</ApplicationData>
</E2ETraceEvent>

131076
3.
0
2.
摩托车
http://msdn.microsoft.com/en-US/library/System.ServiceModel.Diagnostics.TraceHandledException.aspx
处理异常。
685a2910-19-128703978432492675
System.NullReferenceException,mscorlib,版本=2.0.0.0,区域性=neutral,PublicKeyToken=b77a5c561934e089
对象引用未设置为对象的实例。
位于System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMemberMetadata(ResourceType ResourceType,MetadataWorkspace workspace,IDictionary`2 EntitySet,IDictionary`2 knownTypes)
位于System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMetadata(IDictionary`2 knownTypes,IDictionary`2 entitySets)
位于System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata()处
位于System.Data.Services.DataService`1.CreateProvider(类型dataServiceType、对象dataSourceInstance、DataServiceConfiguration&;configuration)
在System.Data.Services.DataService`1.EnsureReproviderAndConfigForRequest()中
位于System.Data.Services.DataService`1.ProcessRequestFormMessage(StreamMessageBody)
在SyncInvokeProcessRequestFormMessage(对象,对象[],对象[])处
位于System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象实例、对象[]输入、对象[]输出)
位于System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&;rpc)
位于System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&;rpc)
位于System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&;rpc)
位于System.ServiceModel.Dispatcher.ImmutableDispatcheRuntime.ProcessMessage3(MessageRpc&;rpc)
位于System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&;rpc)
位于System.ServiceModel.Dispatcher.ImmutableDispatcheRuntime.ProcessMessage1(MessageRpc&;rpc)
位于System.ServiceModel.Dispatcher.MessageRpc.Process(布尔isOperationContextSet)
System.NullReferenceException:对象引用未设置为对象的实例。
位于System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMemberMetadata(ResourceType ResourceType,MetadataWorkspace workspace,IDictionary`2 EntitySet,IDictionary`2 knownTypes)
位于System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMetadata(IDictionary`2 knownTypes,IDictionary`2 entitySets)
位于System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata()处
位于System.Data.Services.DataService`1.CreateProvider(类型dataServiceType、对象dataSourceInstance、DataServiceConfiguration&;configuration)
在System.Data.Services.DataService`1.EnsureReproviderAndConfigForRequest()中
位于System.Data.Services.DataService`1.ProcessRequestFormMessage(StreamMessageBody)
在SyncInvokeProcessRequestFormMessage(对象,对象[],对象[])处
位于System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象实例、对象[]输入、对象[]输出)
位于System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&;rpc)
位于System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&;rpc)
位于System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&;rpc)
位于System.ServiceModel.Dispatcher.ImmutableDispatcheRuntime.ProcessMessage3(MessageRpc&;rpc)
位于System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&;rpc)
位于System.ServiceModel.Dispatcher.ImmutableDispatcheRuntime.ProcessMessage1(MessageRpc&;rpc)
位于System.ServiceModel.Dispatcher.MessageRpc.Process(布尔isOperationContextSet)

我也遇到了类似的问题,这是由于将错误的类传递给DataService造成的。您需要传递数据模型的数据实体类

public class WebDataService : DataService< DataModel.DataEntities >
公共类WebDataService:DataService

我最近遇到了一个类似的问题,在我的案例中,修复程序将EntitySetAccessRule的名称更改为“*”,如下所示:

public static void InitializeService(DataServiceConfiguration config)
{
  config.SetEntitySetAccessRule("*", EntitySetRights.All);
  config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}

我也遇到了同样的问题,解决方案非常简单:尽管我的表名和生成的实体对象是单数“Order”,但在本文中我需要将其称为“Orders”。我还在想那件事。只是EDM标准

config.SetEntitySetAccessRule("Orders", EntitySetRights.All);

希望这能有所帮助。

我也遇到过类似的问题,原因是EF6

根据变化

公共类WebDataService:DataService

公共类WebDataService:EntityFrameworkDataService
应该有帮助

public class WebDataService : DataService< DataModel.DataEntities >
public class WebDataService : EntityFrameworkDataService< DataModel.DataEntities >