2016-03-22 5 views
2

Dies ist das Objekt, das ich versuche zu serialisieren:Serialisieren Entity Objekt

public class EmailAttachment 
{ 
    public int ID { get; set; } 
    public string Filepath { get; set; } 
    public string Filename { get; set; } 

    public int EmailID { get; set; } 

    [IgnoreDataMember] 
    public virtual ReceivedEmail Email { get; set; } 
} 

Und das ist mein Serialisierungscode:

 var attachments = unitOfWork.EmailAttachmentRepository.Get(e => e.EmailID == emailID); 
     return Json(attachments, JsonRequestBehavior.AllowGet); 

Das Problem ist, dass, obwohl ich setzte [IgnoreDataMember] Attribut, Email Eigenschaft EmailAttachment ist noch serialisiert. Ich kann Entity-Protokoll in der Konsole anzeigen, wenn Anhänge zuerst abgerufen werden, gibt es keinen Abruf von Email, weil Lazy Loading aktiviert ist, aber wenn return Json(attachments, JsonRequestBehavior.AllowGet); ausgeführt wird, dann für jede Anlage in Liste Email aus der Datenbank abgerufen wird, und dies wird auf Eigenschaften von Email propagiert .

Wie kann ich das stoppen? Ich möchte nur EmailAttachment ohne seine virtuellen Eigenschaften ...

Antwort

1

verwenden sollten, können Sie verzögertes Laden deaktivieren, wenn Sie Ihren Kontext erstellt haben, würde ich vorschlagen, Ihre Get Methode modifizieren andere bool zu akzeptieren, aktivieren/deaktivieren Lazy Loading:

var attachments = unitOfWork 
    .EmailAttachmentRepository.Get(e => e.EmailID == emailID, lazyloading: false); 

Dann, wo Sie Ihren Kontext erstellen:

using(var ctx = new MyContext()) 
{ 
     ctx.Configuration.LazyLoadingEnabled = lazyloading; //false 
     ... 
} 
+0

Danke, ich habe auch diese mit Konfigurations .ProxyCreationEnabled = false, weißt du, was der Unterschied zwischen diesen beiden ist? – Aleksa

+1

@Aleksa Proxys werden verwendet, um Änderungen automatisch zu erkennen, Beziehungen zu beheben und Lazyloading zu aktivieren. Wenn Sie sie nur für Lesezwecke benötigen (wie Sie es tun), könnte dies eine Leistungssteigerung zur Folge haben, um Proxies auszuschalten. Wenn Sie jedoch nur das verzögerte Laden deaktivieren möchten (nicht die Verfolgung ändern), sollten Sie die Proxys eingeschaltet lassen. –

1

IgnoreDataMemder funktioniert für verschiedene Stapel.

In Ihrem Fall, dass Sie ScriptIgnore Attribure

Verwandte Themen