entity framework4每个层次结构表 – 如何定义儿童的导航属性?

我目前使用Table Per Type(TPT)实现了Entity Framework 4.0模型,但是存在一些性能问题(许多LOJ / CASE语句),以及两个特定域区域之间的问题映射(多个到 – 许多)。

我决定尝试TPH。

我有一个名为“ Location ”的实体,它是抽象的 ,是所有其他实体的基础。

然后我有“ 国家 ”,“ 城市 ”,“ ”,“ 街道 ”等,这些都来自位置。

LocationType ”是判别者

该部分工作正常,但我在尝试为派生类型定义导航属性时遇到问题。

例如,“ ”有一个“ 国家 ”,所以我应该能够这样做:

var state = _ctx.Locations.OfType().Include("Country").First(); var countryForState = state.Country; 

但这需要在“州”派生实体上称为“国家”的导航属性。 我该怎么做呢? 当我从数据库生成模型时,我有一个表,所有FK指向同一个表中的记录:

替代文字

(注意:我在DB中手动创建了这些FK)。

但是FK被定位为“ 位置 ”实体上的导航,那么如何将这些导航属性下移到派生实体? 我不能复制+粘贴导航,我不能“创建新的导航属性”,因为它不会让我定义开始/结束角色。

我们如何做到这一点?

如果我们可以先建立模型,或者我们必须从数据库开始,修复模型然后重新生成数据库,那么TPH也不清楚。 我还没有在互联网上找到一个关于如何使用TPH定义儿童导航的好例子。

注意: 我不想先执行代码 。 我目前的解决方案是TPT与EDMX,纯POCO,我希望不影响域模型/存储库(如果可能),只需更新EF模型/数据库。

编辑

仍然没有解决方案 – 但是我试图做模型优先,并做Add – > New Association,这实际上允许我添加导航到派生实体。 但是当我尝试“从模型生成数据库”时,它仍然尝试为“Location_Street”,“Location_Country”等创建表。这几乎就像TPH不能先完成模型。

编辑

这是我目前的型号:

替代文字

我目前得到的validation错误:

错误1错误3002:从第359行开始映射片段时出现问题:潜在的运行时违反表位置的键(Locations.LocationId):列(Locations.LocationId)在概念方面映射到EntitySet NeighbourhoodZipCode的属性(NeighbourhoodZipCode.Neighbourhood.LocationId)但它们并不构成EntitySet的关键属性(NeighbourhoodZipCode.Neighbourhood.LocationId,NeighbourhoodZipCode.ZipCode.LocationId)。

只是想我会继续编辑这个问题与编辑关于我目前在哪里。 我开始怀疑具有自引用FK的TPH是否可能。

编辑

所以我想出了上面的错误,那是因为我错过了Neighborhood-ZipCode的连接表多对多。

添加连接表(并将导航映射到该表)解决了上述错误。

但现在我得到这个错误:

错误3032:从第373行,第382行开始映射片段时出现问题:条件成员的Locations.StateLocationId具有重复的条件值。

如果我看一下CSDL,这里是“CountyState”的关联映射(一个州有很多县,一个县有一个州):

          

这是Condition ColumnName="StateLocationId"这是抱怨,因为ZipCodeState关联也是这个条件。

但我不明白。 所有实体的鉴别器都是唯一的(我有三重检查),我认为这是一个有效的场景:

  1. 县有一个州,由StateLocationId(Locations表)表示
  2. ZipCode有一个State,由StateLocationId(Locations表)表示

这在TPH中无效吗?

所以我解决了我的一些问题,但我碰到了一堵砖墙。

首先,当您在数据库端创建自引用FK时,当您尝试“从数据库更新模型”时,entity framework会将这些导航属性添加到主基类型,因为它没有明确的TPH感 – 您需要在模型方面做到这一点。

但是,您可以手动将导航属性添加到子类型。

WRT此错误:

错误3032:从第373行,第382行开始映射片段时出现问题:条件成员的Locations.StateLocationId具有重复的条件值。

那是因为我有一个名为“Location_State”的FK我试图用于“ZipCode_State”关系,以及“City_State”关系 – 这不起作用(仍然不知道为什么)。

所以要解决这个问题,我必须添加额外的列和额外的FK – 一个叫做“ZipCode_State”,另一个称为“City_State” – 显然它必须是导航和物理FK之间的1-1。

Location.LocationType没有默认值且不可为空。 存储实体数据需要列值。

这是我的鉴别领域。 在数据库方面,它不可为空

我读了关于这个问题的线索,他们说你需要将关系从0 .. *更改为1 .. * – 但我的关系已经是1 .. *。

如果你查看我上面的“Locations”实际数据库表,所有FK都可以为空(它们必须是)。 因此我开始怀疑我的关系是否应为0 .. *。

但由于TPH,它们可以为空 – 并非所有“地点”都有“国家”。 但如果该位置是“城市”,则它必须具有“状态”。

这个问题让我的感受更加安慰: ADO EF – 错误映射TPH中派生类型之间的关联

我实际上正在尝试这种解决方法(在我遇到它之前),并且解决方法对我不起作用。 我甚至尝试将所有关系从1 .. *更改为0 .. *,但仍然没有运气。

在这里浪费了太多时间,我回到了TPT。

在一天结束时,使用TPH我会有一个可笑的大表,有许多冗余的可空列。 加入方式,效率更高。 但至少对于TPT,我不需要有可空和自我引用的FK。

如果有人有这个问题的解决方案,请告诉我。 但在那之前,我坚持使用TPT。