我有一个由Artist,Author和TextWriter继承的基类参与者。 我在数据存储中只有一个表: 参与者{ ID, 名字, 姓, IsArtist, IsAuthor, IsTextWriter, } 我们的想法是为参与者可以拥有的所有角色提供一个班级。
我设法创建了edmx文件,但是当我尝试获得也是作者的参与者(作为艺术家)时,我收到以下错误:
EntitySet“Participants”中的所有对象必须具有唯一的主键。但是,“Artist”类型的实例和“Author”类型的实例都具有相同的主键值,'EntitySet = Participants; ID = 1'。
谢谢
答案 0 :(得分:3)
是的,这是可能的。你要求的是“table per hierarchy”继承。您的表需要包含任何“鉴别器列”,用于标识每行的类型。
但是,当实现(从DB读取)时,一个人的记录不能具有多个具体类型,因为对象只能有一种类型。 I've written about this issue before:
在设计良好的对象关系映射时,您必须克服的一个心理障碍是倾向于主要以面向对象的术语或关系术语来思考,以适合您的个性。但是,良好的对象关系映射包含了良好的对象模型和良好的关系模型。例如,假设您有一个包含People表的数据库,以及Employees和Customers的相关表。一个人可能在所有三个表中都有记录。现在,从严格的关系角度来看,您可以为员工构建数据库VIEW,为客户构建另一个数据库VIEW,这两者都包含People表中的信息。当使用一个VIEW或另一个时,您可以暂时将个人视为“只是”员工或“只是”客户,即使您知道他们两者都是。所以来自这个世界观的人可能会想要进行OO映射,其中Employee和Customer都是Person的(直接)子类。但这不适用于我们拥有的数据;由于单个人同时拥有员工和客户记录(并且由于任何Person实例都不能同时具有子类型Employee和Customer),因此Person和Employee之间的OO关系需要是组合而不是继承,对于Person和Customer也是如此。
如果“Bob”是同时为艺术家和作者的Participant
,那么他不能同时属于Artist
和Author
类型,除非一个是另一种的超类型。艺术家和作者应该与另一个具有子类型关系,或者您应该使用聚合而不是继承来将Participant
与Artist
和Author
相关联。对象的实例只能有一种具体类型;这不会改变,因为您将它存储到数据库。