- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下数据库模式:
我正在使用 Table-per-Hiearchy (TPH) 继承。案例表的“类型”字段确定案例是电子邮件案例还是推特案例。它们都与 Cases 表是 1:N 关系。
我在 EF 中使用数据库优先方法,这是我想要使用的模型:
问题是我无法使用外键(Email.CaseId <-> Cases.Id 和 Tweets.CaseId <-> Cases.Id)将导航属性映射到子表中。我想要实现的是,EmailCase 实体有一个指向电子邮件的导航属性,而 TwitterCase 实体有一个指向 Tweets 的导航属性。
只有在我添加关联然后手动导航时我才能让它工作,但当然这不会反射(reflect)在数据库中。
我该如何解决这个问题?我应该使用 Table-per-Type (TPT) 而不是 TPH 吗?但在这种情况下,例如,EmailCase 将只包含原始案例的 ID,没有别的,这对我来说听起来很奇怪。 (这是如果我使用模型优先方法会生成的内容。)
或者我应该手动添加关联和导航属性吗?
最佳答案
这很难回答,因为有两个明显的好处 - 一个投票给 TPH,另一个投票给 TPT:
您的模型非常适合 TPH,因为所有属性都在基类中,派生类不会向表中添加任何属性。因此,对三个实体(如果 Cases
是抽象的则为两个)的所有查询只需要这个表,不涉及连接 -> 有利于性能。另一方面,数据库将允许您的模型存在不一致,例如使用 CaseId
=1 的 Emails
记录引用带有此的 Cases
记录Id
=1 但 Type
鉴别符是 TwitterCase
。如果您仅使用 EF 访问数据库,并且 EF 正确执行其工作,则这种情况永远不会发生。如果您有其他来源可能会更改数据库,则可能会发生这种情况。
TPT 将解决可能的模型不一致问题,因为 Emails
表中的 CaseId
将引用 EmailCases
表,并且Tweets
表中的 CaseId
到 TwitterCases
表。但代价是你有这些奇怪的表,它们只包含一个主键列,每个查询 - 无论它多么简单 - 都将涉及 Cases
表和表之间的连接派生类型 -> 不利于性能。
什么对你来说更重要?就个人而言,如果只有您的 EF 应用程序访问数据库,我会在您的特定情况下略微倾向于 TPH - 由于性能优势。但在不了解您的应用程序的整个上下文的情况下,我无法最终决定要做什么。
关于.net - 在继承实体 (TPH) 中映射导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7787440/
我有一个表用于存储 TPH 配置中的几个继承实体。这很好用,没有任何问题。我面临的问题是我需要使用附加字段扩展其中一些实体,并希望使用 TPT 将这些新字段存储在它自己的表中。 为了说明一些背景,我会
首先,这些问题很相似但绝对不一样: Can I mix Table per Hierarchy and Table per Type in Entity Framework? - 指的是不同的场景。
您好,我正在使用 TPH 继承来建立类似的可配置项。我的 TPH 模型是: public class baseConfigItem { public int ID {get;
实体 public abstract class Person { public string FirstName { get; set; } public string LastName {
在我的项目中,我使用 Entity Framework core 2.0。下一个代码稍微简化了。有这样的模型: public class Site { public int Id { get;
我有以下数据库模式: 我正在使用 Table-per-Hiearchy (TPH) 继承。案例表的“类型”字段确定案例是电子邮件案例还是推特案例。它们都与 Cases 表是 1:N 关系。 我在 EF
尝试为我正在制作的系统实现一个非常简单的 TPH 设置,1 个基础类,2 个继承类。 但是继承的类都属于同一个实体集,所以在我的 ObjectContext using 循环中,我只能访问基本抽象类。
我有一张 table : Groups - Id - Name - Type 这张表是一组产品、客户或供应商。要对产品进行分组,我需要在类型列中使用“P”,对客户和供应商进行分组,我需要分别使用
我有一个 wpf 应用程序,其中包含一个首先使用实体框架代码制作的数据库。 我有一个类 Shoes.cs 和两个继承自鞋子的类:Canvas.cs 和 Boots.cs 对于映射,我使用了 tph
背景 我正在使用 .NET Framework 3.5 SP1 在 Visual Studio 2008 SP1 中使用 ADO Entity Framework 编写数据访问库。我正在尝试在两个都派
我将 Entity Framework 6.0.2 与现有数据库一起使用,其中标签存储在单个表中,如下所示: Id: int, 主键 TagType:字符串,判断标签的类型,“usertag”或“mo
我收到错误消息;错误 3032:从第 77 行开始映射片段时出现问题:映射条件成员“Company.CompanyTypeId”,其条件不是“IsNull=False”。删除 Company.Comp
我已经使用 THP 实现了具有简单继承的代码优先数据库架构: 而且我需要查询所有类型的所有通知。NotificationUser 表中的 TargetUser 属性是一个关联。我正在尝试执行下一个代码
我使用的数据结构与此类似,其中动物类型由表中的鉴别器列确定: public class Farm { public int Id { get; set; } public virtua
我将实体配置为始终使用属性“DELETED”='N'进行查询。在 EF 6 中,我可以这样做: modelBuilder.Entity().Map(m => m.Requires("DELETED")
我有一个关于 EF6 的问题。假设我有一个如下所示的抽象基类: [Table("Persons")] public abstract class Person { [Key] publ
我是第一次在 C# MVC 中设置 TPH 继承,我对如何将子类值映射到表有点困惑。例如,我的父实体的流畅 map 是使用以下方式声明的: public class ProjectTaskMap :
我想使用 Mapping Properties of an Entity Type to Multiple Tables in the Database (Entity Splitting)同时使用
可能问题的标题不是不言自明的。 我有一个带有 Entity Framework 6 的 ASP.NET MVC5 项目。我首先使用代码,并且我已经为一个实体实现了 TPH 模式。 有一个基本的请求实体
给定以下类结构 public class Parent { public Guid Id { get; public List Children { get;
我是一名优秀的程序员,十分优秀!