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