Ich habe eine partielle Klassendatei erstellt, um meinem Entity-Framework generierten Modell neue Eigenschaften hinzuzufügen.OData enthalten "Benutzerdefinierte Eigenschaften", die zu Entity Framework-Modellen über Teilklassen hinzugefügt wurden
Ich verwende WebAPI + OData und die $ metadata listet meine neuen/benutzerdefinierten Eigenschaften nicht auf, und so enthält der JSON, den es zurückgibt, meine neuen/benutzerdefinierten Eigenschaften nicht.
Zum Beispiel, sagen wir mal meine Entity ist "Person"
"Person" hat eine Datenbank-Eigenschaft; NumSpouses; ein int, die in $ Metadaten wie folgt zurückgegeben: <Property Name="NumSpouses" Type="Edm.Int32"/>
Das ist großartig, aber ich hinzugefügt bekommen eine Eigenschaft wie diese in einer separaten Datei, with a partial class:
public partial class Person {
...
public string MarriedStatus {
get { return this.NumSpouses==0 ? "Single" : "Married"; }
}
...
}
Wie kann ich diese Immobilie in meiner OData Antworten?
<Property Name="MarriedStatus" Type="Edm.String"/>
Derzeit wenn ich für MarriedStatus
in $expand
gefragt (als ob es ein Navigation war .... das ist es nicht [Ich dachte, ich würde versuchen, $ sowieso zu erweitern, als ob es auf magische Weise benutzerdefinierte Eigenschaften zur Verfügung gestellt]), würde ich eine Nachricht wie diese:
{
"odata.error":{
"code":"","message":{
"lang":"en-US","value":"The query specified in the URI is not valid. Could not find a property named 'MarriedStatus' on type 'fakeDataModels.Person'."
},"innererror":{
"message":"Could not find a property named 'MarriedStatus' on type 'fakeDataModels.Person'.","type":"Microsoft.Data.OData.ODataException","stacktrace":" at ..."
}
}
}
Ist Ihre Teilklasse im selben Namespace wie das EF-generierte Modell? – lencharest
Ja ist es. Der Namespace ist in beiden Dateien konsistent, nennen wir ihn "PersonDataModels", und beide Dateien befinden sich im selben Projekt. Ich weiß, 'Controller.Json' JSON-Serialisierung ist nicht dasselbe wie OData-Serialisierung, aber ich werde darauf hinweisen, dass JSON die 'MarriedStatus'-Eigenschaft serialisiert, es sei denn, ich sage ausdrücklich nicht zu (' ScriptIgnoreAttribute'). Vielleicht erfordert dies das Äquivalent eines "ViewModel", ich sollte meinen clientseitigen (Javascript) Code hinzufügen, der mir nur die Komfortfunktion 'getMarriedStatus()' zur Verfügung stellt. –
Partielle Klassen funktionieren wie erwartet in einem Spielzeugprojekt, das ich erstellt habe. Vielleicht liegt das Problem in Ihrer OData-Konfiguration. Verwenden Sie 'ODataConventionModelBuilder' und registrieren Sie Entitätssätze einfach? Oder etwas anspruchsvoller? – lencharest