【问题标题】:Displaying related data in Web API 2 Entity Framework在 Web API 2 Entity Framework 中显示相关数据
【发布时间】:2017-03-28 20:25:01
【问题描述】:

我的 asp.net MVC 应用程序的 Web API 部分存在一些问题。该应用程序在使用 MVC 控制器和视图时工作正常,但是当尝试通过我的 web api 2 控制器返回订单及其 OrderItem 时,我收到以下错误消息:

“ObjectContent`1”类型无法序列化内容类型“application/xml”的响应正文;字符集=utf-8'。

我认为 MenuItem 的序列化有问题。我尝试从类中删除 Virtual-keyword 并使用 Include 手动包含 MenuItems,但仍然得到相同的错误。

我是否需要为此创建一个 ViewModel 来返回数据?我也试过 JSON.NET 并得到同样的错误。

我有以下课程:

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

    public virtual ICollection<OrderItem> OrderItems { get; set; }
}

public class OrderItem
{
    public int Id { get; set; }
    public decimal UnitPrice { get; set; }
    public int Quantity { get; set; }
    public int Discount { get; set; }

    public virtual Order Order { get; set; }
    public virtual MenueItem MenueItem { get; set; }
}

public class MenueItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Description { get; set; }
    public DateTime CreateDate { get; set; }
    public DateTime LastChanged { get; set; }
    public bool IsActive { get; set; }

    public virtual ICollection<OrderItem> OrderItems { get; set; }
}

以及控制器方法:

    // GET: api/Orders
    public IQueryable<Order> GetOrders()
    {
        var orders = db.Orders.Include(c => c.OrderItems);
        return orders;
    }

【问题讨论】:

  • 有一个循环引用 MenueItem - OrderItems 即使没有发生延迟加载。您可以告诉序列化程序忽略引用循环。
  • 感谢您的回复。我现在正在测试 AutoMapper,可能会走这条路,但是你会如何忽略参考循环?

标签: c# asp.net asp.net-mvc entity-framework rest


【解决方案1】:

您可以指定转换器以忽略循环引用,例如:

var orders = JsonConvert.SerializeObject(db.GetOrders(), new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2020-06-16
    相关资源
    最近更新 更多