Я получаю исключение буфера в одном из моих модульных тестов на моих контроллерах для проекта aspnet.core.
System.Net.Http.HttpRequestException: Невозможно записать больше байтов в буфер, чем настроенный максимальный размер буфера: 2147483647
Копаться в нем - это из-за того, что у меня есть отношения многие ко многимнастроен там, где я включил связанную коллекцию в ответ на объект:
Моя модель (ы):
public class Employee
{
[Key] public Guid Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public decimal Salary { get; set; }
public DateTime HireDate { get; set; }
public Guid? ManagerId { get; set; }
public Guid AddressId { get; set; }
public virtual ICollection<EmployeeRole> EmployeeRoles { get; set; }
public virtual Employee Manager { get; set; }
public virtual ICollection<Employee> Employees { get; set; }
public virtual Address Address { get; set; }
public virtual ICollection<EmployeeProject> Projects { get; set; }
}
public class EmployeeProject
{
[Key]
[Column(Order = 1)]
public Guid EmployeeId { get; set; }
[Key]
[Column(Order = 1)]
public Guid ProjectId { get; set; }
public virtual Project Project { get; set; }
public virtual Employee Employee { get; set; }
}
Моя конфигурация контекста:
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);
});
Проблема в том, что я хочу включить ICollection в свой результат context.Employess. то есть
ctx.Employees.Include(e => e.Projects).ToListAsync();
Это приводит к тому, что все связанные записи Employee будут включены в каждую запись EmployeeProject, которая, в свою очередь, имеет связанную ICollection и так далее. т.е.
[
{
"Id": "1",
"Projects": [
{
"EmployeId": "1"
"ProjectId": "A"
"Employee":
{
"Id": "1"
"Projects": [
{
"EmployeId": "1"
"ProjectId": "A"
"Employee":
и т. д.
При возврате в веб-ответе происходит переполнение буфера.
Я игнорирую ReferenceLoopHandling в моей конфигурации:
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,