C# 序列化实体对象

C# 序列化实体对象,c#,asp.net,json,entity-framework,serialization,C#,Asp.net,Json,Entity Framework,Serialization,这是我尝试序列化的对象: 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 ReceivedEma

这是我尝试序列化的对象:

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; }
}
这是我的序列化代码:

        var attachments = unitOfWork.EmailAttachmentRepository.Get(e => e.EmailID == emailID);
        return Json(attachments, JsonRequestBehavior.AllowGet);
问题是,尽管我放置了
[IgnoreDataMember]
属性,
EmailAttachment
Email
属性仍然是序列化的。我可以在控制台中看到实体日志,当首先获取附件时,由于启用了延迟加载,所以不会获取
电子邮件,但是当
返回Json(附件,JsonRequestBehavior.AllowGet)时,并在
电子邮件的属性上传播


我怎样才能阻止这一切?我只需要
EmailAttachment
而不需要它的虚拟属性…

IgnoreDataMemder
适用于不同的堆栈


在您的情况下,您应该使用Attribure

您可以在创建上下文时禁用延迟加载,我建议修改
Get
方法以接受另一个
bool
以启用/禁用延迟加载:

var attachments = unitOfWork
    .EmailAttachmentRepository.Get(e => e.EmailID == emailID, lazyloading: false);
然后在创建上下文的位置:

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

谢谢,我也在配置中这样做了。ProxyCreationEnabled=false,你知道这两者之间的区别吗?@Aleksa代理用于自动检测更改、修复关系和启用懒散加载。如果您出于只读目的(像您一样)需要它们,那么关闭代理可能会提高性能。但是,如果您只想禁用延迟加载(而不是更改跟踪),则应该启用代理。