Entity Framework Бесконечная самоссылающаяся сущность - PullRequest
0 голосов
/ 10 февраля 2019

у меня есть 3 таблицы и 3 класса сущностей, а имена таблиц - Roles, Acls, AclsInRole.

Роль класса сущностей связана с сущностью AclsInRole

public class RoleEntity : IdentityRole<Guid>, IEntity
{
public virtual ICollection<AclInRoleEntity> AclRelations { get; } = new List<AclInRoleEntity>();
}

, а Acl entiy имеет связь сСущность AclsInRole

public class AclEntity : BaseEntity
{
  public virtual ICollection<AclInRoleEntity> RoleRelations { get; } = new List<AclInRoleEntity>();
}

и

public class AclInRoleEntity : BaseEntity
    {
        #region Core Properties

        public Guid RoleId { get; set; }

        public virtual RoleEntity Role { get; set; }

        public Guid AclId { get; set; }

        public virtual AclEntity Acl { get; set; }

        #endregion Core Properties
    }

. Я запускаю блок кода в следующем коде. Этот код возвращает рекурсивный объект.Например: RoleEntity -> AclInRoleEntity-> AclEntity -> AclInRoleEntity -> RoleEntity -> AclInRoleEntity -> AclEntity -> AclInRoleEntity -> RoleEntity -> ......

 RoleEntity entity = this._unitOfWork.GetRepository<RoleEntity>().GetFirstOrDefault(
                role => role.Id == new Guid("6FE68340-933C-4F94-64FA-08D68EBA5E79") && role.IsActive, null,
                roles => roles.Include(role => role.AclRelations).ThenInclude(aclRel => aclRel.Acl));

Вы можете мне помочь?Как можно решить рекурсивную задачу?

1 Ответ

0 голосов
/ 11 февраля 2019

Бесконечный цикл самоссылки, с которым вы сталкиваетесь, называется proxy creation при использовании Eager Loading / Lazy loading в EF / EF Core.Вы не можете остановить создание этого прокси при использовании Eager Загрузка в EF / EF Core.Это стандартное поведение ядра EF / EF, и его нельзя изменить.

Но может быть (я не пробовал) вы можете остановить создание прокси для Lazy Loading в EF Core> = 2.1 как EF Core документация сказал.

Но вы можете остановить цикл самоссылки из-за прокси при преобразовании сущности в JSON следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );

    ...
}

Для получения более подробной информации: Связанные данные и сериализация

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