链接 table 的 ASMX 循环引用错误

A circular reference error with ASMX with linked table

我在 Web 应用程序中有以下 ASMX service 代码。正在尝试获取 XML 格式的数据。为了清楚起见,我删除了一些数据

    /// <summary>
    /// Summary description for CompanyServices
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class CompanyServices: System.Web.Services.WebService
    {
        [WebMethod]
        public List<Product> GetData(int companyId, int custId)
        {
          return ProductService.GetCompanyData(companyId, custId).ToList();
        }

在调试模式下所有运行,但我不断收到错误

System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: A circular reference was detected while serializing an object of type Company

所以我创建了相同的类型并且围绕它有一个类似于

的循环
foreach (Product p in ProductService.GetCompanyData(companyId, custId).ToList())
{
  Product newProd = new Product
  newProd.Name = p.Name;
  newProd.Department = p.Department;
}

这一直有效,直到我添加部门,它链接到另一个 table(部门)

用 Google 搜索但不知道是什么原因造成的或如何解决?

循环引用意味着你有一个对象 a 引用了 b(例如 a.B = b),但不知何故 b 引用了 a(例如 b.A = a).

不幸的是,两个对象并不总是指向另一个对象。导致循环的链条可以更长(比如 product 指向另一个 product 指向 department 又指向 product)。

大多数时候,根本原因是您的服务公开了使用父子关系连接的原始 Entity Framework(或其他 ORM)对象。因为 ORM 导航属性是延迟加载的,任何时候你有一个 product,它有它的父级(比如 product.Department)但是 departmentProducts 属性指向产品,其中一个产品与您在开始时访问过的产品完全相同。有你的周期。

解决方案是创建另一组 类,即 DTO 类,您只在其中维护单向导航属性。因此,例如,ProductDTO 有其父项 DepartmentDTO,但 DepartmentDTO 故意 缺少 IEnumerable<ProductDTO> Products 属性 .

这样,跟随您的导航属性的序列化程序会在某个点停止,因为没有循环。您的服务公开了这些 DTO 类

[WebMethod]
public List<ProductDTO> GetData(int companyId, int custId)
{
   return ProductService.GetCompanyData(companyId, custId).ToDTO();
}