【问题标题】:How to Get Full Object with Code First Entity Framework 4.1如何使用 Code First Entity Framework 4.1 获取完整对象
【发布时间】:2011-07-31 22:02:19
【问题描述】:

我试图以 JSON 格式返回完全深度的对象(填充了所有外键关系),但我得到所有引用对象的空值。

这是获取对象的调用:

    public ActionResult GetAll()
    {
        return Json(ppEFContext.Orders, JsonRequestBehavior.AllowGet);
    }

这里是 Order 对象本身:

public class Order
{
    public int Id { get; set; }

    public Patient Patient { get; set; }

    public CertificationPeriod CertificationPeriod { get; set; }

    public Agency Agency { get; set; }

    public Diagnosis PrimaryDiagnosis { get; set; }

    public OrderApprovalStatus ApprovalStatus { get; set; }

    public User Approver { get; set; }

    public User Submitter { get; set; }

    public DateTime ApprovalDate { get; set; }

    public DateTime SubmittedDate { get; set; }
    public Boolean IsDeprecated { get; set; }
}

我还没有找到关于使用 EF 4.1 Annotations 的好资源。如果你能推荐一个好的,有答案的,你可以给我链接,这对我来说就足够了!

问候,

圭多

更新

我按照 Saxman 添加了 virtual 关键字,现在是 处理循环引用 错误问题。

【问题讨论】:

标签: c# code-first ef-code-first entity-framework-4.1


【解决方案1】:

在您的相关实体之前添加virtual 关键字:

public class Order
{
    public int Id { get; set; }

    public virtual Patient Patient { get; set; }

    public virtual CertificationPeriod CertificationPeriod { get; set; }

    public virtual Agency Agency { get; set; }

    public virtual Diagnosis PrimaryDiagnosis { get; set; }

    public virtual OrderApprovalStatus ApprovalStatus { get; set; }

    public virtual User Approver { get; set; }

    public virtual User Submitter { get; set; }

    public DateTime ApprovalDate { get; set; }

    public DateTime SubmittedDate { get; set; }
    public Boolean IsDeprecated { get; set; }
}

如果您的对象相互引用,您最终可能会遇到A circular reference was detected while serializing an object... 错误。在这种情况下,您需要创建一个ViewModel 或类似的东西来解决这个问题。或者使用 LINQ 投影一个匿名对象。

【讨论】:

  • 这取得了进展,但现在我在你描述的地方。带有循环引用异常。我正在阅读有关将外来对象的 id 添加到模型和其他解决方案的信息。
  • 你现在真的不能做太多,用一个引用另一个对象的对象序列化是不可能的。就像我建议的那样,您可以创建一个只有您需要的数据的 ViewModel,或者投影到一个匿名对象,即:stackoverflow.com/questions/4436328/…
【解决方案2】:

【讨论】:

  • 我的第一个想法是看看延迟加载。
  • 是的,但是如果你总是需要加载每个引用的属性,每次加载都显式地写 Include 是不舒服的,也许还有另一种配置延迟加载的方法
猜你喜欢
  • 2023-04-02
  • 2012-05-15
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多