- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前有一个 Entity Framework 4.0 模型和 Table Per Type (TPT),但存在一些性能问题(很多 LOJ/CASE 语句),以及两个特定域区域之间的问题映射(许多-对多)。
我决定试用 TPH。
我有一个名为“Location”的实体,它是抽象的,也是所有其他实体的基础。
然后我有 "Country", "City", "State", "Street",等等,它们都来自 Location。
“LocationType”是鉴别器。
那部分工作正常,但我在尝试为派生类型定义导航属性时遇到问题。
例如,“State”有一个“Country”,所以我应该可以这样做:
var state = _ctx.Locations.OfType<State>().Include("Country").First();
var countryForState = state.Country;
但这需要在“State”派生实体上有一个名为“Country”的导航属性。我该怎么做呢?当我从数据库生成模型时,我有一个表,所有 FK 都指向同一个表中的记录:
(注意:我在数据库中手动创建了这些 FK)。
但是 FK 作为导航放置在“Location”实体上,那么我如何将这些导航属性向下移动到派生实体?我无法复制粘贴导航,也无法“创建新的导航属性”,因为它不允许我定义开始/结束角色。
我们如何做到这一点?
TPH 也不清楚我们是否可以模型优先,或者我们必须从数据库开始,修复模型然后重新生成数据库。我还没有在 Internet 上找到关于如何为患有 TPH 的 child 定义导航的好例子。
注意:我不想代码优先。我当前的解决方案有带有 EDMX 的 TPT 和纯 POCO,我希望不影响域模型/存储库(如果可能),并且只更新 EF 模型/数据库。
编辑
仍然没有解决方案 - 但是我尝试先做模型,然后做添加 -> 新关联,这实际上允许我向派生实体添加导航。但是当我尝试“从模型生成数据库”时,它仍然会尝试为“Location_Street”、“Location_Country”等创建表。这几乎就像 TPH 不能首先完成模型一样。
编辑
这是我当前的模型:
我目前收到的验证错误:
Error 1 Error 3002: Problem in mapping fragments starting at line 359:Potential runtime violation of table Locations's keys (Locations.LocationId): Columns (Locations.LocationId) are mapped to EntitySet NeighbourhoodZipCode's properties (NeighbourhoodZipCode.Neighbourhood.LocationId) on the conceptual side but they do not form the EntitySet's key properties (NeighbourhoodZipCode.Neighbourhood.LocationId, NeighbourhoodZipCode.ZipCode.LocationId).
只是想我会继续编辑这个问题,编辑关于我目前所在的位置。我开始怀疑是否有可能使用自引用 FK 的 TPH。
编辑
所以我发现了上面的错误,那是因为我缺少 Neighbourhood-ZipCode 的连接表,多对多。
添加连接表(并将导航映射到该表)解决了上述错误。
但是现在我收到了这个错误:
Error 3032: Problem in mapping fragments starting at lines 373, 382:Condition members 'Locations.StateLocationId' have duplicate condition values.
如果我查看 CSDL,这里是“CountyState”的关联映射(一个州有多个县,一个县有 1 个州):
<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
关联也是这个条件。
但是我不明白。所有实体的鉴别器都是唯一的(我已经三重检查),我认为这是一个有效的场景:
这在 TPH 中无效吗?
最佳答案
所以我解决了一些问题,但我遇到了困难。
首先,当您在数据库端创建自引用 FK 时,当您尝试“从数据库更新模型”时, Entity Framework 会将这些导航属性添加到主要基类型,因为它没有明确的意义TPH - 您需要在模型端执行此操作。
但是,您可以手动将导航属性添加到子类型。
WRT 这个错误:
Error 3032: Problem in mapping fragments starting at lines 373, 382:Condition members 'Locations.StateLocationId' have duplicate condition values.
那是因为我有一个名为“Location_State”的 FK,我试图将其用于“ZipCode_State”关系和“City_State”关系 - 这不起作用(仍然不知道为什么)。
因此,为了解决这个问题,我必须添加额外的列和额外的 FK - 一个称为“ZipCode_State”,另一个称为“City_State” - 显然它必须是导航和物理 FK 之间的 1-1。
Location.LocationType has no default value and is not nullable. A column value is required to store entity data.
那是我的鉴别器字段。在数据库端,它是不可空。
我阅读了有关此问题的帖子,他们说您需要将关系从 0..* 更改为 1..* - 但我的关系已经是 1..*。
如果您查看上面我的“位置”实际数据库表,所有 FK 都可以为空(它们必须是)。因此我开始怀疑我的关系是否应该是 0..*。
但由于 TPH,它们可以为空 - 并非所有“位置”都有“州”。但如果该位置是“城市”,那么它必须有一个“州”。
这个 SO 问题进一步安慰了我:ADO EF - Errors Mapping Associations between Derived Types in TPH
我实际上正在尝试该解决方法(在我遇到它之前),但该解决方法对我不起作用。我什至尝试将所有关系从 1..* 更改为 0..*,但仍然没有成功。
在这里浪费了太多时间,我回到了 TPT。
归根结底,如果使用 TPH,我会得到一个大得离谱的表,其中包含大量冗余的、可为 null 的列。 JOIN-wise,它更有效率。但至少对于 TPT,我不需要具有可为 null 和自引用的 FK。
如果有人能解决这个问题,请告诉我。但在那之前,我会坚持使用 TPT。
关于c# - Entity Framework 4 Table Per Hierarchy - 如何定义子项的导航属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4263546/
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicates: What is a framework? What does it do? Why do we need a f
我在按照 http://msdn.microsoft.com/en-us/data/jj591621.aspx 处的 Microsoft Data Developer 过程启用代码优先迁移时遇到了一些
我正在从 迁移项目 Entity Framework 4.3 在 .net 4 上运行到 Entity Framework 5 在 .net 4.5 上运行。在不做任何更改的情况下,当我尝试运行该项目
我正在使用 Entity Framework 6 并使用 EntityFramework Extended 来执行一些批量更新和批量删除。批量更新和批量删除工作正常,但我还需要知道更新/删除的实体(即
我在实体上添加了一个列,然后从模型中生成数据库或构建解决方案,然后收到一条消息,提示我刚添加的新列未映射。该数据库以前是从模型创建的,没有错误。 当我右键单击Entity并选择Table Mappin
每次我尝试运行我的代码时都会崩溃,因为我尝试启动函数以调用 SDK 的任何部分。 我在构建过程中包含了 FoundationSDK: 并且我在头文件中包含了对 SDK 的引用: 但是每次我运行这个,我
我以前能够毫无问题地提交我的申请。我的工作流程中唯一改变的部分是使用 Sourcetree。在对以下框架进行更新后,我在提交到 iOS App Store 时收到此警告。我还收到一封电子邮件,其中包含
假设我为 Asp.NET Web 应用程序安装了 .NET Framework 2.0、3.0、3.5。 我意识到 Framework 3.0 和 3.5 只是 Framework 2 的扩展,不太清
是否有 SaveChanges 事件在保存更改后但在更新更改跟踪器之前触发? 我正在使用 EF 6。 我需要在某个实体的状态发生变化时执行任务。 我已经覆盖了 SaveChanges 来设置它。我可以
我正在使用一个现有的数据库,并且我已经将其中一个表映射为一个实体(因为我需要映射一个外键)。 因此,在初始化此数据库时,我希望 EF 忽略此实体,因为它已经存在。 我该怎么做? 最佳答案 您应该使用
我有 3 个表需要与 Entity Framework 进行映射,但我不确定解决此问题的正确方法。这是我的 3 个实体: public class User { [Key] public
我首先使用 VS 2010 和 Entity Framework 代码(版本 6)。我有两个实体,每个实体都在自己的上下文中,我想在它们之间创建一对多关系。 上下文 1 具有以下实体: public
我知道 EF 在 CodePlex 上是开源的,但我没有看到当前发布的 5.0 版本的分支。我在哪里可以得到这个源代码? 最佳答案 没有。他们只开源了 post 5 版本。第一次签到可能足够接近,但再
我们目前有一个数据库很大的系统,存储过程既用于CUD又用于查询。数据集用于从 SP 查询中检索结果。 现在我们正在研究使用 Entity Framework 针对同一个数据库开发另一个项目。在查询数据
我有一个每 10 秒运行一次的 Windows 服务......每次运行时,它都会获取一些测试数据,对其进行修改并使用 EntityFramework 将其保存到数据库中。但是,在每一秒运行时,当我尝
我对在我们的场景中仅将 Entity Framework 与存储过程一起使用的合理性有疑问。 我们计划拥有一个 N 层架构,包括 UI、BusinessLayer (BLL)、DataAccessLa
当我使用 Entity Framework 时,我想在上下文中查询出一条记录并将其添加到具有相同架构的另一个上下文中,在查询出记录后,我将其从上下文中分离出来,但是相关实体都没有了,是吗?有什么办法解
我正在使用 Entity Framework 5 构建 ASP.Net MVC4 Web 应用程序。我必须使用现有的 sql server 数据库,但也想使用 Code First,所以我遵循了本教程
在 Entity Framework 4.0 中使用 T4 模板创建 POCO 会丢失什么?为什么使用 Entity Framework 4.0 时的默认行为不创建 POCO? 最佳答案 你会失去很多
我在网上使用 Repository Pattern 和 EF 看了很多例子。但他们都没有真正谈到与相关实体的合作。 就像说用户可以有多个地址。 IUserRepository User CreateU
我是一名优秀的程序员,十分优秀!