我目前有一个实体框架4.0模型,其中包含每类型表(TPT),但存在一些性能问题(很多LOJ/CASE语句),以及两个特定域区域(多对多)之间的问题映射。
我决定试试TPH。
我有一个实体叫做
位置
“那是
摘要
,以及所有其他实体的基。
我就有了
国家
", "
西蒂
", "
国家
", "
街道
“,等等,都来源于地点。
"
位置类型
“是
二边肌
.
这部分工作正常,但我在尝试为派生类型定义导航属性时遇到问题。
例如,a“
国家
“有一个”
国家
“,所以我应该能够做到:
var state = _ctx.Locations.OfType<State>().Include("Country").First();
var countryForState = state.Country;
但这需要在“State”派生实体上有一个名为“Country”的导航属性。我该怎么做?从数据库生成模型时,我有一个表,其中所有FK指向同一表中的记录:
(注意:我在数据库中手动创建了那些FK)。
但FK被定位为
位置
“实体,那么如何将这些导航属性下移到派生实体?我不能复制并粘贴导航,也不能“创建新的导航属性”,因为它不允许我定义开始/结束角色。
我们怎么做?
TPH也不清楚我们是否可以先对它建模,或者我们必须从DB开始,修复模型,然后重新生成DB。我还没有在网上找到一个很好的例子来说明如何定义TPH儿童的nav。
注:
我不想先做代码
. 我目前的解决方案有带EDMX的TPT和纯POCO的TPT,我希望不影响域模型/存储库(如果可能的话),只更新EF模型/数据库。
编辑
仍然没有解决方案-但是我尝试先做模型,然后做添加-gt;新关联,这实际上允许我向派生实体添加导航。但当我尝试“从模型生成数据库”时,它仍然尝试为“Location廑Street”、“Location廑Country”等创建表,这几乎就像TPH不能先做模型一样。
编辑
这是我目前的型号:
当前收到的验证错误:
错误1错误3002:映射中的问题
从第行开始的片段
359:潜在的运行时冲突
表位置键
(Locations.LocationId):列
(Locations.LocationId)映射到
实体集邻域zipcode's
属性
(邻居zipcode.neighbory.LocationId)
在概念方面,但他们没有
形成实体集的键属性
(neighboryzipcode.neighbory.LocationId,
邻居ZipCode.ZipCode.LocationId)。
我想我会继续编辑这个问题,编辑是关于我现在在哪里。我开始怀疑是否有可能用自述FK的TPH。
编辑
所以我发现了上面的错误,那是因为我错过了邻域ZipCode many-to-many的连接表。
添加连接表(并将导航映射到该表)解决了上述错误。
但现在我发现这个错误:
错误3032:映射中的问题
从第373行开始的片段,
382:条件成员
'Locations.StateLocationId'有
重复的条件值。
如果我看一下CSDL,这里是“County State”(一个州有多个县,一个县有一个州)的关联映射:
<AssociationSetMapping Name="CountyState" TypeName="Locations.CountyState" StoreEntitySet="Locations">
<EndProperty Name="State">
<ScalarProperty Name="LocationId" ColumnName="StateLocationId" />
</EndProperty>
<EndProperty Name="County">
<ScalarProperty Name="LocationId" ColumnName="LocationId" />
</EndProperty>
<Condition ColumnName="StateLocationId" IsNull="false" />
</AssociationSetMapping>
就是那个
Condition ColumnName="StateLocationId"
这是抱怨,因为
ZipCodeState
联想也是这种情况。
但我不明白。所有实体的鉴别器都是唯一的(我已经进行了三次检查),我认为这是一个有效的场景:
-
-
ZipCode只有一个状态,由StateLocationId(Locations表)表示
在TPH中无效吗?