【发布时间】:2015-03-16 15:40:34
【问题描述】:
刚开始使用实体框架(代码优先),我不得不说我在加载相当复杂的 SQL 数据时遇到了很多问题。例如,假设我有以下表格,其中存储了哪些动物属于世界上的哪些地区,并且动物也被分类。
Table: Region
Id: integer
Name string
Table AnimalCategory
Id integer
Name: string
RegionId: integer -- Refers back Region
Table Animal
Id integer
AnimalCategoryId integer -- Refers back AnimalCategory
假设我想使用实体框架创建一个查询,该查询将加载特定区域的所有动物。最简单的做法是创建 3 个实体 Region、AnimalCategory 和 Animal 并使用 LINQ 加载数据。
但是假设我对加载任何 AnimalCategory 信息不感兴趣并定义一个 Entity 类来表示 AnimalCategory 以便我可以执行 JOIN。如何使用实体框架做到这一点?即使有许多映射功能,我仍然认为这是不可能的。
在非实体框架解决方案中,这很容易通过在 SP 中使用 INNER JOIN 或内联 SQL 来实现。那么我在实体框架中有哪些选择?我是否应该用这些无用的表污染我的数据模型,以便我可以进行 JOIN?
【问题讨论】:
-
污染在哪里?您要么将动物直接与区域相关联(具有多对多关系,可能 => 您不需要中间实体,即使您的数据库中存在中间表),或者您想要一个中间 AnimalCategory。在 Sql 中,对于这种情况,您需要 AnimalCategory 表。这是污染吗?
-
如果你必须定义一个实体只是为了做一个JOIN,那就是污染。想象一下,您无法控制它在数据库中的存储方式。您只是数据的消费者,您感兴趣的只是区域和与该区域关联的动物列表。你不关心中间的任何事情。那么为什么要定义实体类并使它们对您的应用程序层可见呢?现在您可以说您的数据库实体/模型与您的应用程序域模型不同,并且它们之间发生了另一种转换。这一切都很好,但有潜在的重复。
-
如果这些表没用,那么我不知道为什么它们会放在首位!如果您无论如何都打算将这些表用于内联 SQL 或 SP 中的内部联接,那么为什么不通过 EntityFramework 使用它们呢?目前还不清楚您对 EF 的期望。如果没有这些实体,您将无法确定哪种动物属于哪个地区。你能解释一下如何在没有这些表的情况下使用内联 SQL 来完成吗?
-
Nilesh,这很简单。您只需执行 SELECT a.* FROM Animal a INNER JOIN AnimalCategory ac ON a.AnimalCategoryId = ac.Id WHERE ac.RegionId = @RegionId。我对“无用”这个词的使用我想有点强。这些中间表可能对其他消费者有用,但我们只是说为了我的应用程序,除了执行 JOIN 的目的之外,根本不使用这些中间表。我的观点是,似乎 Entity Framework 迫使我创建这些实体只是为了做那个 JOIN。
标签: entity-framework orm entity