Serialization 防止引用循环属性序列化

Serialization 防止引用循环属性序列化,serialization,entity-framework-core,many-to-many,Serialization,Entity Framework Core,Many To Many,我在一个aspnet.core项目控制器的单元测试中遇到缓冲区异常 System.Net.Http.HttpRequestException:向缓冲区写入的字节数不能超过配置的最大缓冲区大小:2147483647 深入研究-这是因为我配置了多对多关系,在对实体的响应中包含了相关集合: 我的型号: 这导致所有相关的员工记录都包含在每个EmployeeProject记录中,而每个EmployeeProject记录又包含相关的ICollection等等。i、 e [ { "Id"

我在一个aspnet.core项目控制器的单元测试中遇到缓冲区异常

System.Net.Http.HttpRequestException:向缓冲区写入的字节数不能超过配置的最大缓冲区大小:2147483647

深入研究-这是因为我配置了多对多关系,在对实体的响应中包含了相关集合:

我的型号:

这导致所有相关的员工记录都包含在每个EmployeeProject记录中,而每个EmployeeProject记录又包含相关的ICollection等等。i、 e

[
    {
       "Id": "1",
       "Projects": [
                      {
                         "EmployeId": "1"
                         "ProjectId": "A"
                         "Employee": 
                                    {
                                         "Id": "1"
                                         "Projects": [
                                                        {
                                                            "EmployeId": "1"
                                                             "ProjectId": "A"
                                                             "Employee":
等等

当在web响应中返回时,会导致缓冲区溢出

我正在忽略配置中的ReferenceLoopHandling:

        modelBuilder.Entity<EmployeeProject>(employeeProject =>
        {
            employeeProject.HasKey(ep => new {ep.EmployeeId, ep.ProjectId});
            employeeProject.HasOne(ep => ep.Project)
                .WithMany(p => p.EmployeeProjects)
                .HasForeignKey(ep => ep.ProjectId);
            employeeProject.HasOne(ep => ep.Employee)
                .WithMany(e => e.Projects)
                .HasForeignKey(ep => ep.EmployeeId);

        });

        modelBuilder.Entity<Employee>(emp =>
        {
            emp.HasKey(e => e.Id);
            emp.Property(p => p.Id).ValueGeneratedOnAdd();
            emp.HasMany(e => e.EmployeeRoles);
            emp.HasOne(e => e.Manager).WithMany(e => e.Employees).IsRequired(false);
            emp.HasOne(e => e.Address).WithOne(a => a.Employee)
                .HasForeignKey<Employee>(e => e.AddressId);
            emp.HasMany(e => e.Projects);
        });
services.AddMvc().AddJsonOptions(options =>
        {
            options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        });
从Newtonsoft.Json名称空间

/// <summary>Ignore loop references and do not serialize.</summary>
Ignore,
/// <summary>Serialize loop references.</summary>
Serialize,
///忽略循环引用而不序列化。
忽略,
///序列化循环引用。
连载,

您可以尝试以下属性:

[JsonObject(IsReference=true)]
将此属性添加到类的顶部

[JsonIgnore]
该属性位于导致引用循环的属性的顶部


我希望我能清楚地理解您的问题。

您没有说明如何配置单元测试,但似乎没有添加/模拟
services.AddMvc()
services.AddMvc().AddJsonOptions(options =>
        {
            options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        });
/// <summary>Ignore loop references and do not serialize.</summary>
Ignore,
/// <summary>Serialize loop references.</summary>
Serialize,