刚开始使用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?
答案 0 :(得分:0)
我想这是一个选择问题。 EF选择支持与透明联结表的多对多关联,即联结表只有两个到关联实体的外键。他们根本没有选择以类似的方式支持这种不太常见的“跳过一对多”情景。
我可以想象为什么。
首先,在多对多关联中,联结表只不过是:联结,关联。但是,在一对多(或多对一)关联的链中,任何涉及的表只是一个关联将是例外。在你的例子中......
Animal → AnimalCategory → Region
... AnimalCategory
仅只有主键(Id
)和外键(RegionId
)。但这可能毫无用处:Animal
本身也可能有RegionId
。没有理由支持没有意义的数据模型。
你所追求的是一个模型,其中中间的表确实带有信息(AnimalCategory.Name
),但你想将它映射为透明的联结表,因为一个特定的类model不需要这些信息。
您的重点似乎是阅读数据。但EF必须支持所有CRUD操作。这里的问题是:如何处理插入?假设Name
是必填字段。没有办法提供它的价值。
另一个问题是像......这样的陈述。
region.Animals.Add(animal);
......可能意味着两件事:
Animal
和新 AnimalCategory
,后者指的是Region
。Animal
引用现有 AnimalCategory
- 无法选择哪一个。 EF不希望选择某些默认行为。您必须自己做出选择,这样您就无法访问AnimalCategory
。