问题标签 [table-per-type]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
14650 浏览

.net - 无法保存实体框架继承的类型

我已经在我的数据模型中实现了一些 table-per-type 继承(基本上有一个BaseEntity包含我的项目的所有基本信息的Employer类型和一个从BaseEntity项目继承的类型)。一切似乎都设置正确,并且在使用实体时(通过 ADO.net 数据服务或通过 Linq to Entities)我可以看到Employer类型并且事情似乎很好。当我创建一个新Employer实体并尝试保存它时,问题就开始了。

在似乎不是.AddToEmployer项目的上下文中(只有 and AddObjector AddToBaseEntity)。

如果我使用AddObject("Employer", NewEmployer),我会收到以下错误消息:

找不到实体集名称“DataEntities.Employer”。

如果我使用AddToBaseEntity(NewEmployer),我会收到以下错误消息:

无法确定相关操作的有效排序。由于外键约束、模型要求或存储生成的值,可能存在依赖关系。

我是否错过了设置继承的步骤?是否有一些特定的方法来保存继承的对象?我究竟做错了什么?我认为基本问题是我应该有一个AddToEmployer,我需要做什么才能暴露它?这似乎很奇怪,因为我可以在客户端看到 Employer 类型并且可以执行以下操作:

var NewEmployer = new Employer()- 这似乎表明我可以很好地看到 Employer 类型。

0 投票
1 回答
3069 浏览

linq - Linq to Entities, Table per Type 和 Nullable Foreign Key 关系

我正在将 Linq 用于应用每个类型方法的表的实体。到目前为止,这一直进展顺利。我有以下设置:

  • 父表
  • 子表(从父表继承)
  • 大子表(继承自子表)
  • 链接表(外键可为空,到子表)

这是数据库图

替代文字

在上述视频之后,我将 Table Per Type 方法应用于 Linq to 实体在将上述表添加到模型时创建的默认模式。

在按类型应用表之前:

替代文字

在每种类型的表之后:

替代文字

然后我编译了项目并得到了你可以在上图中看到的错误。为了解决这个问题,我去了外键链接的映射,我添加了 childid 字段,错误消息正在抱怨。

替代文字

然后我重新编译并得到另一个错误:

从第 147、176 行开始的片段映射问题:具有不同键的两个实体映射到同一行。确保这两个映射片段不会将具有重叠键的两组实体映射到同一组行。

这就是我现在的重点。问题似乎是“LinkingTable”上的“ChildID”为空。如果我将其设置为不可为空,我不会收到上述错误。

我已将上述步骤中使用的数据库和项目保存到天空驱动器

有谁知道如何解决这个错误?

戴夫

这是固定代码(感谢 The Gecko)

0 投票
1 回答
2461 浏览

entity-framework - 实体框架的继承问题(每种类型的表)

对于我目前正在处理的项目的一部分,我有一组用于联合操作的四个表。一个表是其他三个表的抽象基础,每个表都在我的 EF 模型中表示,如下所示:

EF 模型 -- 动作 http://chris.charabaruk.com/system/files/images/EF+Model+Actions.png

但是,我目前面临两个问题。第一个问题是Actor(对 a 的引用User)和Subject(对与每种类型的操作关联的类的实体的引用)null在我的子类中,尽管关联的数据库列在其关联表中保存了行的有效键。虽然我可以通过获取密钥ActorReferenceSubjectReference但这当然需要设置一个新的 EF 上下文并查询它以获取引用的对象(也是 null)。FooReference.Value

第二个问题是具体动作类与其相关实体类之间关系的互惠端总是什么都没有。例如Task.RelatedActions,它应该给我所有引用特定任务对象的对象,它TaskAction完全没有对象。同样,数据库中存在有效行,Entity Framework 只是没有将它们放入对象中并将它们交给我。SubjectRelatedActions

任何人都知道我做错了什么,我应该怎么做才能让它发挥作用?

更新:似乎所有关系属性都不再在我的实体模型中工作了。哎呀...

0 投票
1 回答
835 浏览

.net - 尝试过滤从实体框架中的另一个继承的实体的属性时出错

例如,当我让实体 B 从实体 A 继承使用 table-per-type 进行存储并尝试编写一个 Linq 查询来过滤 B 上的属性时

我得到错误

LINQ to Entities 不支持指定的类型成员“名称”。仅支持初始化程序、实体成员和实体导航属性。

过滤基表中存在的任何属性都可以正常工作。知道我做错了什么吗?

0 投票
1 回答
568 浏览

entity-framework - 转换为实体框架 (TPT) 中子类的属性引用

我有以下方案:(不是真正的代码,只是为了理解)

Employee 类型在数据库中有自己的表(Table-per-Type 继承)。

假设我有一个没有加载 ContacePerson 的 Company 实例。如何加载 ContactPerson 以便它也加载 Employee 字段(如果需要)?

有没有办法在所有公司的选择中也确定它?

谢谢

0 投票
2 回答
745 浏览

inheritance - 如何向 EntityDataModel (EF 4) 中定义的对象添加继承?

我在 EF 模型中定义了一个简单的 2 对象继承,Person <- User。

Person 是基础实体/类,它不是抽象的,它包含名字、姓氏、电子邮件等字段。

User 是派生的实体/类,包含用户名、lastlogin、islockedout 等字段。

数据库使用每个类型的表模式,因此有一个表用于人员,另一个表用于用户。两者都使用相同的主键字段 PersonID。PersonID 是一个 IDENTITY 列,但在 EDM 中,PersonID 的 StoreGeneratedPattern 设置为 None。

因为这是一个 table-per-type 继承模式,所以可能有一个 Person 行/对象没有对应的 User 行/对象。这样系统就可以包含关于非用户的数据。但是,一个人最终可能会成为用户,这就是我遇到问题的地方。

我有一个针对这种情况的测试用例,其中系统找到了一个想要变成用户的人。我尝试在新的用户对象上设置 PersonID 字段,将其添加到 ObjectContext 并保存更改。发生的情况是数据库创建了一个新的 Person 行以及新的 User 行,而忽略了我为 PersonID 设置的值。

我怎样才能解决这个问题?我是否必须创建存储过程来处理 EDM crud 操作?

0 投票
0 回答
791 浏览

entity-framework-4 - EF4 TPT 插入继承表

假设我的应用程序使用两个表示为两个实体的表:Person 和 Employee。

和:

  • 我不允许更改表人。(我建议从视图中获取数据)
  • Employee 必须从 Person 继承。

我正在尝试实现 Table-Per-Type 继承,但我不知道如何在表 Employee 中插入行。

员工资料库:

0 投票
2 回答
269 浏览

asp.net - 如何应用 Table-per-type EF4 在从 aspnet_Users 继承的子表中创建记录?

从常规的 aspnet_Users 表中,我创建了两个在 UserId 上具有一对一关系的子表。

我在 edmx 中创建了一个 Table per Type 模型,现在希望在通过成员存储过程创建新的 aspnet_User 记录时在适当的子表中创建适当的记录,如下所示:

它是“UserClient”还是“UserEmployee”类型取决于它的 RoleId,我目前在查询需要时区分它。现在我希望通过表格来扩展每种类型的属性。

假设新创建的用户是客户。

如何使用 aspnet_Users 的 UserId 和此 ClientNumber 将记录插入到 UserClient 表中?

0 投票
2 回答
1325 浏览

c# - 每个类型的 EF 表,在子类型表上具有导航属性

我希望 SO 社区中的某个人能够在这里帮助我。

简化背景:我正在使用 Entity Framework V1 来构建下面概述的类结构,我正在使用 Table Per Type 来保存我的继承对象:

CaseB 对 Employee 有一个导航属性

我有一个返回 ObjectQuery 的存储库。如果 Case 的类型实际上是 CaseB,我需要在图中包含 Employee 对象。我不能 .Include("Employee") 因为它不是 Case 的导航属性,并且 Employee 上没有 .Load() 方法。

理想情况下,我希望能够在一个查询中执行此操作,但是作为后备,我很高兴我拨打电话,检查对象并执行另一个调用,如下所示:(尽管正如我之前所说,加载没有' t 存在于员工导航属性上)

我在这里错过了一些非常简单的东西吗?

0 投票
2 回答
4220 浏览

entity-framework - 每个类型的实体框架表性能

所以事实证明,在实现 TPT(按类型表)继承时,我是最后一个发现 Microsoft 实体框架中存在的基本层的人。

构建了一个包含 3 个子类的原型,基表/类由 20 多列组成,子表由约 10 列组成,一切都运行良好,我继续研究应用程序的其余部分,证明了这个概念。现在是添加其他 20 个子类型和 OMG 的时候了,我刚刚开始查看通过简单选择生成的 SQL,即使我只对访问基类上的字段感兴趣。

此页面对问题进行了精彩的描述。

有没有人使用 TPT 和 EF 投入生产,是否有任何变通办法意味着我不必:a)将架构转换为 TPH(这与我尝试通过我的数据库设计实现的一切 - urrrgghh!)?b)用另一个ORM重写?

在我看来,我应该能够从 EF(可能使用 EFExtensions)中添加对存储过程的引用,该存储过程具有仅选择我需要的字段的 TSQL,即使使用 EF 为怪物 UNION 生成的代码SP 内的 /JOIN 会阻止每次调用时生成 SQL - 我不打算这样做,但你明白了。

我发现的杀手是,当我选择链接到基表的实体列表时(但我选择的实体不是子类表),并且我想通过基表的 pk 进行过滤,并且我.Include("BaseClassTableName")允许我过滤使用x=>x.BaseClass.PK == 1和访问其他属性,它也在这里执行母 SQL 生成。

我无法使用 EF4,因为我仅限于安装了 3.5 SP1 的 .net 2.0 运行时。

有没有人有摆脱这个烂摊子的经验?