2008-11-05 6 views
2

Je reçois un message d'erreur lors de l'exposition d'un service de données ADO.NET à l'aide d'un modèle de données Entity Framework contenant une entité (appelée "Case") avec un paramètre interne sur une propriété. Si je modifie le setter pour qu'il soit public (en utilisant le concepteur d'entité), les services de données fonctionnent correctement.Erreur de requête ADO.NET Data Services Entity Framework lorsque la propriété setter est interne

Je n'ai pas besoin de l'entité "Case" exposée dans le service de données, j'ai donc essayé de limiter les entités exposées en utilisant SetEntitySetAccessRule. Cela n'a pas fonctionné et le point de fin de service échoue avec la même erreur.

public static void InitializeService(IDataServiceConfiguration config) 
{ 
    config.SetEntitySetAccessRule("User", EntitySetRights.AllRead); 
} 

Le message d'erreur est signalée dans un navigateur lorsque le point final de .svc est appelé. Il est très générique et lit "Request Error". Le serveur a rencontré une erreur lors du traitement de la requête. Voir les journaux du serveur pour plus de détails. "Malheureusement, il n'y a aucune entrée dans les journaux d'événements du système et de l'application.

J'ai trouvé ce stackoverflow question qui montre comment configurer le suivi sur le service. Après cela, l'erreur NullReferenceExceptoin suivante a été signalée dans le journal de suivi.

Est-ce que quelqu'un sait comment éviter cette exception en incluant une entité avec un setter interne?

<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> 

Répondre

0

J'ai eu un problème similaire, et il a été provoqué en transmettant la mauvaise classe à DataService. Vous devez transmettre la classe d'entités de données du modèle de données.

public class WebDataService : DataService<DataModel.DataEntities> 
2

Je suis récemment tombé sur un problème similaire, et le correctif dans mon cas a été changinghe le nom du EntitySetAccessRule à « * », comme ceci:

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

J'ai eu le même problème, et la solution s'est avérée très simple: bien que mon nom de table et l'objet d'entité généré soit le singulier "Order", j'ai besoin de le désigner dans ce contexte par "Orders". Je suis toujours en train de faire ça. juste la norme EDM.

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

Espérons que cela aide.

0

J'ai eu un problème similaire causé par EF6.

Selon this article changer

public class WebDataService : DataService<DataModel.DataEntities> 

à

public class WebDataService : EntityFrameworkDataService<DataModel.DataEntities> 

devrait aider

Questions connexes