在使用 EF Core 中的多对多关系时,是否真的有必要忽略自我引用的循环呢?
在使用 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。
是否真的有必要忽略这种类型的错误,或者有更好的方法来解决这个问题?
自我引用循环问题只是应用程序设计选择不当的结果。我建议您不要返回与EF相关联的实体,而是返回表示应用程序终端接口的模型,即数据传输对象。该对象只呈现所需的数据,应该是从特定终端呈现的数据。例如,如果像您一样返回Person
实体,那么关系属性PersonClubsId
是否真的需要表示一个人?或者例如,如果有一些元数据字段,如CreatedDate
,CreatedBy
,那么这些字段很可能不应该包含在内。相反,创建一个代表Person
的自定义类,该类以最佳方式表示实体的属性。
将EF实体与应用程序终端接口解耦的另一个原因是,如果对Person
实体的数据库结构进行任何更改,这些更改将反映在客户端上,因为它们都使用相同的模型。
我第一次阅读您的回答时,我觉得它很傻。然后我去检查我的代码,发现我的终端确实试图返回一个实体,而不是其相应的DTO。当我纠正它后,我的代码就开始正常工作了,非常感谢!