2 Stimmen

Die Ausnahmemeldung lautet 'Wert kann nicht null sein. Parametername: propertyResourceType'

Gerade installiert WCF CTP2 mar2011 und versucht, Web-Service über Browser zugreifen. (http://localhost:99/Services/MyDataService.svc/) Ich erhalte diese Ausnahme:

**The server encountered an error processing the request. The exception message is 'Value cannot be null. Parameter name: propertyResourceType'. See server logs for more details.** The exception stack trace is:
at System.Data.Services.Providers.ResourceProperty..ctor(String name, ResourcePropertyKind kind, ResourceType propertyResourceType)
at System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMemberMetadata(ResourceType resourceType, IProviderMetadata workspace, IDictionary`2 knownTypes, PrimitiveResourceTypeMap primitiveResourceTypeMap)
at System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMetadata(IDictionary`2 knownTypes, IDictionary`2 childTypes, IDictionary`2 entitySets)
at System.Data.Services.Providers.BaseServiceProvider.LoadMetadata()
at System.Data.Services.DataService`1.CreateProvider()
at System.Data.Services.DataService`1.HandleRequest()
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[]& outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

Gibt es Hilfe?

Update: Ich habe herausgefunden, dass das Problem mit dieser Eigenschaft zusammenhängt

 [Required]
    public byte TypeId { get; set; }

    public ContactInfoType Type
    {
        get
        {
            return (ContactInfoType)TypeId;
        }
        set
        {
            TypeId = (byte)value;
        }
    }

Interessant ist, dass in WCF4 alles in Ordnung ist. Aber es löst eine Ausnahme in WCF CTP2march aus. ContactInfoType - ist eine Aufzählung.

[IgnoreProperties("Type")] hat keine Auswirkungen.

Update2. Nach der Untersuchung ein Problem herausgefunden, dass Ausnahme in der Setter Teil der Eigenschaft geworfen.

  public ContactInfoType Type
    {
        set
        {
            TypeId = (byte)value;
        }
    }

3voto

crimbo Punkte 9192

Ich erhielt den gleichen Fehler in einem .NET 4.5 WCF Data Services-Dienst (vermutlich mit WCF Data Services 5.0). Nach dem Upgrade auf WCF Data Services 5.2.0 (über NuGet) erhielt ich hilfreichere Fehlermeldungen, die mich auf die problematische Eigenschaft hinwiesen, die eine enum typisierte Eigenschaft, wie oben.

Wow, Enums werden in WCF Data Services 5.2.0 immer noch nicht unterstützt - das ist das am meisten geforderte Feature hier: http://data.uservoice.com/forums/72027-wcf-data-services-feature-suggestions (Stimmen Sie ab, wenn es Ihnen wichtig ist!)

Es gibt derzeit zwei Möglichkeiten, dies zu umgehen - eine besteht darin, eine skalare Eigenschaft freizulegen und die [NotMapped] Attribut für die Enum-Eigenschaft zu verwenden und sie mit demselben Einzelwert zu versehen. Die andere Möglichkeit ist, eine "enum-ähnliche" Entitätsklasse zu erstellen, die den Enum-Typ ersetzt, was den zusätzlichen Vorteil hat, dass die Enum-Werte in der DB gespeichert werden. Hier ist ein Beispiel:

public class Priority
{
    public Priority()
    {}

    protected Priority(short id, string name)
    {
        Id = id;
        Name = name;
    }

    public short Id { get; set; }
    public string Name { get; set; }

    public static readonly Priority Unknown = new Priority(0, "Unknown");
    public static readonly Priority Optional = new Priority(1, "Optional");
    public static readonly Priority Low = new Priority(2, "Low");
    public static readonly Priority Normal = new Priority(3, "Normal");
    public static readonly Priority High = new Priority(4, "High");
    public static readonly Priority Critical = new Priority(5, "Critical");
    public static readonly Priority Blocking = new Priority(6, "Blocking");
}

2voto

Christian.K Punkte 44708

Nur eine wilde Vermutung, aber könnte es sein dieses Thema :

Wenn ein Entitätsdatenmodell einen Entitätstyp enthält, der eine Eigenschaft hat vom Typ DateTimeOffset hat, löst ein ADO.NET Data Service ein unbehandeltes ArgumentNullException. Wenn Sie den Eigenschaftstyp in DateTime ändern, verschwindet die Ausnahme.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X