EntityFramework,DB和Domain

时间:2013-06-19 17:14:17

标签: c# database entity-framework orm

我的域名由两个类组成。 第一个是病人。 第二是注射。 人可以有很多注射实例。

这引发了关于某些OOD,关系数据库设计和ORM(特别是EntityFramework)的架构问题:

我希望患者将持有注射属性列表并且注射将持有患者财产。这看起来像是一个很好的面向对象设计。

此设计(首先使用EntityFramework代码),将映射到两个表:Patients表和Injections表。 Injections表将在Patients表中有一行外键。

到目前为止一切顺利。

现在,让我们假设一个如上所述的数据库案例,其中1名患者有100,000次注射。

当我向DbContext询问该患者时,它将检索患者数据,并且仅根据需要加载注射列表。

这看起来像是一个潜在的问题。我对患者的任何潜在用户说 - “嘿,你有一份注射清单,使用它们!只做 - myPatient.Injections他们会神奇地出现”。

然而,通过公开这个属性,我可能会让患者的用户运行一个非常繁重的查询,甚至可能不是应用程序需要。

可能的解决方案是从患者类中删除注射列表。 关于数据库,映射将保持不变,并且为了查询患者的注射,我将使用具体服务。 但是现在我的患者课程并不能很好地代表我的领域。

另一种可能的解决方案是将从EF上下文返回的每个对象映射到另一个浅层对象。我将仅映射我需要的内容,并且不会将不需要的数据暴露给用户。 这种方法将导致重复和维护类之间的映射。

您如何看待这个问题?

分享你的知识:)

1 个答案:

答案 0 :(得分:1)

这完全取决于您实际暴露对象的方式。

如果对象在域模型级别公开,那么是,对注入couls的延迟加载查询可能会加载并实现100k项目。但是,嘿,创建100k实例并插入它们或做任何重的事情也可能是昂贵的。

这意味着如果您担心可能的滥用,请不要将域模型暴露给潜在客户。相反,拥有你的服务层,甚至可能通过http公开,以便你永远不会遇到这样的问题,例如 - 大型集合将始终通过分页公开。