【问题标题】:Serializing Entity object序列化实体对象
【发布时间】:2016-07-09 04:35:45
【问题描述】:

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

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]属性,但EmailAttachmentEmail属性仍然是序列化的。我可以在控制台中看到实体日志,首先获取附件时没有获取Email,因为启用了延迟加载,但是当执行return Json(attachments, JsonRequestBehavior.AllowGet); 时,从数据库中获取列表Email 中的每个附件,这在Email 的属性上传播。

我怎样才能阻止这种情况?我只想要EmailAttachment 没有它的虚拟属性...

【问题讨论】:

    标签: c# asp.net json entity-framework serialization


    【解决方案1】:

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

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

    然后你在哪里创建你的上下文:

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

    【讨论】:

    • 谢谢,我也是用 Configuration.ProxyCreationEnabled = false 做的,你知道这两者有什么区别吗?
    • @Aleksa 代理用于自动检测更改、修复关系和启用延迟加载。如果您需要它们用于只读目的(就像您一样),关闭代理可能会提高性能。但是,如果您只想禁用延迟加载(而不是更改跟踪),则应该打开代理。
    【解决方案2】:

    IgnoreDataMemder 适用于不同的堆栈。

    在你的情况下,你应该使用ScriptIgnore Attribure

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2012-03-12
      • 2011-12-09
      • 2015-11-23
      • 1970-01-01
      相关资源
      最近更新 更多