2

我有两个类,ClientAuthor,它们都派生自Member它们没有向Member添加任何内容,但我更喜欢为语义和可能的后续扩展提供单独的类。我根据角色进行区分,其中作者是具有AuthorRole成员资格的成员,而客户是具有ClientRole成员资格的成员。使用带有鉴别器列的普通 TPH 映射会排除Member既是Client又是Author

我能看到解决这个问题的唯一方法是让ClientRepositoryAuthorRepository进行映射,我的数据库上下文幸福地不知道任何继承,但在这里我受到了性能影响,因为例如 ClientRepository 将不得不查询成员实例和将这些映射到客户端实例。

还有其他方法可以做到这一点吗?

4

1 回答 1

0

EF 中的 TPH 映射表示客户是成员,作者是成员,但永远不会有一个成员既是客户又是作者。甚至不可能有成员将角色从客户更改为作者,反之亦然。

如果要将两个派生类存储在同一个表中,则必须使用 TPH 和鉴别器。EF 将确保前面的规则得到保证。如果这些规则中的任何一个在您的方案中无效,那么无论如何继承对您来说都是一个糟糕的设计,因为即使 .NET 也不允许您将实例的类型从客户端更改为成员。

如果要保留当前设计,则必须使用客户端存储库和附加级别的映射到自定义类,因为 EF 无法通过关系驱动 TPH 继承。在 EF 中,这样的继承不能存在,因为您可以更改关系但不能更改已创建实例的类型。

于 2012-04-23T21:10:52.487 回答