C# 带链接表的ASMX的循环参考误差

C# 带链接表的ASMX的循环参考误差,c#,asp.net,linq-to-sql,asmx,C#,Asp.net,Linq To Sql,Asmx,我在Web应用程序中为ASMX服务提供了以下代码。正在尝试以XML格式获取数据。为了清晰起见,我删除了一些数据 /// <summary> /// Summary description for CompanyServices /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfil

我在Web应用程序中为
ASMX服务
提供了以下代码。正在尝试以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();
        }
因此,我创建了相同的类型,并在其周围为每个循环创建了一个类似于

foreach (Product p in ProductService.GetCompanyData(companyId, custId).ToList())
{
  Product newProd = new Product
  newProd.Name = p.Name;
  newProd.Department = p.Department;
}
这一直有效,直到我在中添加了Department,该Department链接到另一个表(部门表)


谷歌搜索了一下,但不知道是什么原因造成的,也不知道如何解决?

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

不幸的是,两个对象并不总是相互指向对方。导致循环的链可能更长(如
产品
指向另一个
产品
,该产品指向
部门
,该部门又指向
产品

大多数情况下,根本原因是您的服务公开了原始实体框架(或其他ORM)对象,这些对象是使用父子关系连接的。因为ORM导航属性是延迟加载的,所以每当您有
产品时,它都有它的父项(如
产品.部门
),但是
部门
产品
属性,该属性指向产品,其中一个产品就是您在开始时已经访问过的产品。这是你的自行车

解决方案是创建另一组类DTO类,在这些类中只维护单向导航属性。例如,一个
ProductDTO
有它的父对象
DepartmentDTO
,但是
DepartmentDTO
故意缺少
IEnumerable Products
属性

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

[WebMethod]
public List<ProductDTO> GetData(int companyId, int custId)
{
   return ProductService.GetCompanyData(companyId, custId).ToDTO();
}
[WebMethod]
公共列表GetData(int companyId、int custId)
{
返回ProductService.GetCompanyData(companyId,custId.ToDTO();
}

那么ProductDTO是一个新类,具有与Product类相同的所有属性?另外,您是如何将扩展添加到代码的返回行的?是的,是一个新类,但您注意不要具有双向导航属性。该扩展只是一个示例,可以按任何方式将域实例转换为DTO实例。
[WebMethod]
public List<ProductDTO> GetData(int companyId, int custId)
{
   return ProductService.GetCompanyData(companyId, custId).ToDTO();
}