我有两个类,客户端和作者,它们都来自 Member 。它们没有为 Member 添加任何内容,但我更喜欢为语义和后来的扩展提供单独的类。我根据角色进行区分,其中作者是具有 AuthorRole 成员资格的成员,客户是会员,具有 ClientRole 会员资格。使用带有鉴别器列的普通vanilla TPH映射会阻止成员成为客户端和作者。
我能看到解决此问题的唯一方法是让 ClientRepository 和 AuthorRepository 进行映射,我的数据库上下文幸福地不知道任何继承,但在这里我受到表现打击,因为例如ClientRepository必须查询成员实例并将这些实例映射到客户端实例。
还有其他方法吗?
答案 0 :(得分:0)
EF中的TPH映射表明客户端是成员,作者是成员,但永远不会有成员是客户端和作者。甚至不可能有成员将角色从客户改为作者,反之亦然。
如果要在同一个表中存储两个派生类,则必须使用TPH和鉴别器。 EF将确保确保先前的规则。如果这些规则中的任何规则在您的方案中无效,那么继承对您来说是一个糟糕的设计,因为即使.NET也不允许您将实例的类型从客户端更改为成员。
如果要保留当前的设计,则必须使用客户端存储库和其他级别的映射到自定义类,因为EF无法通过关系驱动TPH继承。在EF中意味着这种继承不存在,因为您可以更改关系但不能更改已创建实例的类型。