相关疑难解决方法(0)

你如何有效地模拟数据库中的继承?

在数据库中建模继承的最佳实践是什么?

权衡取舍(例如可疑性)是什么?

(我对SQL Server和.NET最感兴趣,但我也想了解其他平台如何解决这个问题.)

.net sql-server oop inheritance database-design

124
推荐指数
5
解决办法
5万
查看次数

实体框架4每个层次结构表 - 如何定义儿童的导航属性?

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

我决定尝试TPH.

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

然后我有" 国家 "," 城市 "," "," 街道 "等,这些都来自位置.

" LocationType "是判别者.

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

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

var state = _ctx.Locations.OfType<State>().Include("Country").First();
var countryForState = state.Country;
Run Code Online (Sandbox Code Playgroud)

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

替代文字

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

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

我们如何做到这一点?

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

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

编辑

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

编辑

这是我目前的型号:

替代文字

我目前得到的验证错误:

错误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"的关联映射(一个州有很多县,一个县有一个州):

<AssociationSetMapping Name="CountyState" TypeName="Locations.CountyState" StoreEntitySet="Locations">
   <EndProperty Name="State"> …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework sql-server-2008 entity-framework-4 table-per-hierarchy

10
推荐指数
1
解决办法
2792
查看次数