我有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));
你能帮我吗?如何解决递归问题?
答案 0 :(得分:1)
在EF / EF Core中使用急切加载/延迟加载时,遇到的无限自我引用循环称为proxy creation
。在EF / EF Core中使用“急切加载”时,无法停止此代理的创建。这是EF / EF核心的默认行为,无法更改。
但是也许(我没有尝试过),您可以按照EF Core documentation所述在EF Core> = 2.1中停止延迟加载的代理创建。
但是由于将实体转换为JSON时,由于代理的原因,您可以停止自我引用循环:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddMvc()
.AddJsonOptions(
options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);
...
}
有关更多详细信息:Related data and serialization