实体框架:无需创建实体即可进行JOIN

时间:2015-03-16 15:40:35

标签: entity-framework orm entity

刚开始使用Entity Framework(Code First),我不得不说在加载相当复杂的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

我想说我想用Entity Framework创建一个查询,该查询将为特定区域加载所有动物。最简单的方法是创建3个Entities Region,AnimalCategory和Animal,并使用LINQ加载数据。

但是,让我们说我对加载任何AnimalCategory信息并定义一个Entity类只是为了表示AnimalCategory并不感兴趣,这样我就可以进行JOIN了。如何使用Entity Framework执行此操作?即使有很多Mapping功能,我仍然认为这是不可能的。

在非实体框架解决方案中,通过在SP或内联SQL中使用INNER JOIN很容易实现。那么我在实体框架中的选择是什么?我应该用这些无用的表来污染我的数据模型,这样我才能做一个JOIN?

1 个答案:

答案 0 :(得分:0)

我想这是一个选择问题。 EF选择支持与透明联结表的多对多关联,即联结表只有两个到关联实体的外键。他们根本没有选择以类似的方式支持这种不太常见的“跳过一对多”情景。

我可以想象为什么。

首先,在多对多关联中,联结表只不过是:联结,关联。但是,在一对多(或多对一)关联的链中,任何涉及的表只是一个关联将是例外。在你的例子中......

Animal → AnimalCategory → Region

... AnimalCategory 只有主键(Id)和外键(RegionId)。但这可能毫无用处:Animal本身也可能有RegionId。没有理由支持没有意义的数据模型。

你所追求的是一个模型,其中中间的表确实带有信息(AnimalCategory.Name),但你想将它映射为透明的联结表,因为一个特定的类model不需要这些信息。

您的重点似乎是阅读数据。但EF必须支持所有CRUD操作。这里的问题是:如何处理插入?假设Name是必填字段。没有办法提供它的价值。

另一个问题是像......这样的陈述。

region.Animals.Add(animal);

......可能意味着两件事:

  1. 添加Animal AnimalCategory,后者指的是Region
  2. 添加Animal引用现有 AnimalCategory - 无法选择哪一个。
  3. EF不希望选择某些默认行为。您必须自己做出选择,这样您就无法访问AnimalCategory