在使用 EF Core 中的多对多关系时,是否真的有必要忽略自我引用的循环呢?

25 浏览
0 Comments

在使用 EF Core 中的多对多关系时,是否真的有必要忽略自我引用的循环呢?

我试图在EF Core上建立一个多对多的关系,按照这个模型:https://stackoverflow.com/a/46184785/11234800。但是每次我尝试从这个关系中查询一个人及其所有俱乐部时,如下所示:

public async Task> GetAll()
{
    var query = _dbContext.Set()
        .Include(pc => pc.PersonClubs).ThenInclude(c => c.Club)
        .AsQueryable();
    return await query.ToListAsync();
}

我总是遇到循环自引用错误,我通过以下方法解决了这个问题:https://stackoverflow.com/a/34847316/11234800

是否真的有必要忽略这种类型的错误,或者有更好的方法来解决这个问题?

0
0 Comments

自我引用循环问题只是应用程序设计选择不当的结果。我建议您不要返回与EF相关联的实体,而是返回表示应用程序终端接口的模型,即数据传输对象。该对象只呈现所需的数据,应该是从特定终端呈现的数据。例如,如果像您一样返回Person实体,那么关系属性PersonClubsId是否真的需要表示一个人?或者例如,如果有一些元数据字段,如CreatedDateCreatedBy,那么这些字段很可能不应该包含在内。相反,创建一个代表Person的自定义类,该类以最佳方式表示实体的属性。

将EF实体与应用程序终端接口解耦的另一个原因是,如果对Person实体的数据库结构进行任何更改,这些更改将反映在客户端上,因为它们都使用相同的模型。

我第一次阅读您的回答时,我觉得它很傻。然后我去检查我的代码,发现我的终端确实试图返回一个实体,而不是其相应的DTO。当我纠正它后,我的代码就开始正常工作了,非常感谢!

0