我的模型设计中有一个非常深的关系树,即根实体包含一个实体集合,该集合包含更多其他实体的集合,该集合包含更多集合并且在...我开发了一个其他开发人员拥有的业务层用于执行操作,包括获取/保存数据。
然后,我正在考虑应对这种情况的最佳策略是什么。我不能允许在检索实体时,EF 解析所有依赖关系树,因为它将以很多无用的 JOIN 结束(没用,因为我可能不需要下一级的数据)。
如果我禁用延迟加载并强制执行所需的急切加载,它会按预期工作,但如果其他开发人员调用
child.Parent.Id
而不是child.ParentId
尝试做一些新的事情(比如一开始没有考虑的新要求或功能),它会得到一个NullReferenceException
if不包括该依赖项,这很糟糕……但这将是一个“快速错误”,并且可以立即修复。如果我启用延迟加载,每次访问数据库时,访问
child.Parent.Id
而不是将以对数据库的独立查询结束。child.ParentId
它不会失败,但更糟糕的是因为没有错误,只是性能下降,所有代码都应该审查。
我对这两种解决方案中的任何一种都不满意。
我不高兴拥有包含 null 或空集合的实体,而实际上,这不是真的。
我不喜欢让 EF 随时对数据库执行任意查询。如果可能的话,我想在一次拍摄中获得所有信息。
所以,我想出了几个可能的解决方案,包括禁用延迟加载和强制加载,但不确定哪个更好:
我可以创建一个
EntityBase
类,其中包含表中没有集合的数据,因此无法访问它们。以及包含关系的具体实现,问题是你没有太多的灵活性,因为 C# 不允许多重继承。我可以创建接口来“屏蔽”隐藏在该方法调用中不可用的属性的对象。例如,如果我有一个
User.Roles
属性,为了向所有用户显示一个网格,我不需要解析该.Roles
属性,因此我可以创建一个不包含此类属性的接口“IUserData”。
但如果这项额外的工作值得,我不这样做,也许快速NullReferenceException
指示“此属性尚未加载”就足够了。
如果属性是虚拟的并且没有被覆盖/设置,是否可以抛出特定的异常类型?
你用什么方法?
谢谢。