Предотвратить сериализацию свойств ссылочного цикла - PullRequest
0 голосов
/ 02 ноября 2019

Я получаю исключение буфера в одном из моих модульных тестов на моих контроллерах для проекта 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,

1 Ответ

0 голосов
/ 03 ноября 2019

Вы можете попробовать эти атрибуты:

[JsonObject(IsReference = true)] Этот атрибут к вершине ваших Класс и

[JsonIgnore] Этот атрибут к вершине ваших Свойство , которое вызывает цикл ссылок.

Надеюсь, я ясно понимаю вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...