2014-06-06 4 views
6

In meinem Entwurf habe ich eine Klasse, die eine Eigenschaft, deren Typ hat aus vererbt werden:Wie kann verhindert werden, dass Json.NET den Namen des Entity Framework-Proxy-Typs verwendet?

public class Feed 
{ 
    ... 
    [JsonProperty(TypeNameHandling = TypeNameHandling.Auto)] 
    public FeedSource Source { get; set; } 
    ... 
} 

public abstract class FeedSource { ... } 

public class CsvSource : FeedSource { ... } 

public class DbSource : FeedSource { ... } 

Ich verwende das Entity Framework dieses Objekt in einer Datenbank zu laden und zu speichern, und ich bin mit Json. NET, um dieses Objekt zur weiteren Verarbeitung in JSON zu serialisieren.

Das Problem, auf das ich gestoßen bin, ist, dass die $type Eigenschaft den Typnamen des EF-Proxys anstelle des "echten" Typennamens enthält. Also statt:

$type: "System.Data.Entity.DynamicProxies.CsvSource_0B3579D9BE67D7EE83EEBDDBFA269439AFC6E1122A59B4BB81EB1F0147C7EE12" 

, die für andere Kunden bedeutungslos ist, würde ich bekommen:

$type: "MyNamespace.CsvSource" 

in meinem JSON.

Was ist der beste Weg, dies zu erreichen?

+2

Ist das Deaktivieren der Verwendung/Erstellen von Proxy-Objekten eine Option für diesen Code-Pfad? Read-Only/Eager-Load Verwendung von EF scheint es nicht zu brauchen AFAICT? –

+0

Die Vermeidung der Proxy-Generierung (oder die Deaktivierung durch Festlegen von "ProxyCreationEnabled" auf "false") könnte in bestimmten Fällen eine Strategie sein. Es wird jedoch andere Fälle geben, in denen dies nicht anwendbar ist und meine Frage offen bleibt. – Dejan

+1

mögliches Duplikat von [Serialisierung von Entity Framework-Objekten mit One to Many-Beziehung] (http://stackoverflow.com/questions/13077328/serialization-of-entity-framework-objects-with-one-to-many-relationship) –

Antwort

4

Sie können zwei Dinge tun:

  • deaktivieren Proxies Verfolgung von ProxyCreationEnabled auf false setzen. Sie können diese Eigenschaft in der Eigenschaft Configuration Ihres Kontexts finden. Wenn Sie einen Kontext für eine einzelne GetXxx-Methode verwenden, können Sie dies tun, ohne andere instanziierte Kontexte zu beeinträchtigen.

  • die AsNoTracking() Extension-Methode verwenden, wenn Sie Ihre Einheit wiederherzustellen, wie folgt aus:

    MyContext.MyTable.AsNoTracking(). // rest of the query here

Dies zeigt an, dass Sie keine Tracking-Proxy für Ihr Unternehmen wollen, so werden Sie Holen Sie sich die Entitätsklasse. Dies hat keine Auswirkungen auf die oben erwähnte Konfiguration.

+0

Ich denke du hast Recht. Obwohl ich mir vorstellen konnte, dass Json.NET bei der Serialisierung einfach die Basisklasse anstelle des Proxys verwendet. – Dejan

+0

Kennt jemand einen Verweis auf eine gute Dokumentation über Nebenwirkungen der Deaktivierung der Proxy-Generierung? – Dejan

+0

Hier haben Sie eine großartige Erklärung: http://StackOverflow.com/Questions/7111109/Should-Ienable-Or-Disable-Dynamic-Proxies-with-entity-framework-4-1-and-mvc3 – JotaBe

4

Eine andere Möglichkeit, die erfordert keinen Änderungen an der EF-Konfiguration machen ist eine benutzerdefinierte SerializationBinder zu verwenden, zB:

class EntityFrameworkSerializationBinder : SerializationBinder 
{ 
    public override void BindToName(Type serializedType, out string assemblyName, out string typeName) 
    { 
     assemblyName = null; 

     if (serializedType.Namespace == "System.Data.Entity.DynamicProxies") 
      typeName = serializedType.BaseType.FullName; 
     else 
      typeName = serializedType.FullName; 
    } 

    public override Type BindToType(string assemblyName, string typeName) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Verbrauch:

string json = JsonConvert.SerializeObject(entityFrameworkObject, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All, Binder = new EntityFrameworkSerializationBinder() }); 
Verwandte Themen