我试图了解EF4中的继承映射。
我的数据库有两个表,结构如下:
PersonCategory表:
人员表
PersonCategory表有四个条目,每个条目代表一个类别 - 学生,CourseInstructor,Staff和Advisor。
从在线阅读articles我认为每个层次结构表将是此方案的合适模型。所以在EF4中,我创建了四个实体(Student,CourseInstructor,Staff和Advisor),每个实体都继承自Person表。然后我将它们中的每一个映射到Person表并向每个表添加一个条件(例如,StudentID = 1表示Student实体,CategoryID = 2表示Staff实体)以区别于其他表。我还从Person表中删除了CategoryID属性并使其成为抽象类。但是我收到以下错误,因为我从Person表中删除了CategoryId属性。
错误3015:从第101,108,114,120,126,133行开始映射片段时出现问题:从表Person(CategoryID)到表PersonCategory(CategoryID)的外键约束'FK_Person_PersonCategory'::映射不足:外键必须映射到概念方参与外键关联的某些AssociationSet或EntitySets。
每个层次结构表是否适用于此方案?如果没有,那么我应该如何在EF4中处理这种情况?
答案 0 :(得分:5)
在关联中使用鉴别器列是有问题的。见: -
“关键点是作为鉴别器的列无法映射到关联,除非它参与非空条件。”
答案 1 :(得分:0)
我认为你真正想要的是每种类型的表格 http://www.robbagby.com/entity-framework/entity-framework-modeling-table-per-type-inheritance/
答案 2 :(得分:0)
对于Table-per-Hierarchy,单个表包含所有类型的所有列。你有两张桌子,所以我立即怀疑。
如果选择Table-per-Type,那么它也不对。您只能有两种类型,base和derived,PersonCategory表提供派生类型属性值的数据。但是,这需要将PersonID作为外键,而不是。
就个人而言,我认为你不必要地将你的实体分成不同的类型。您可以将两个表中的所有列映射到一个实体,或者如果可能,更改数据库架构以更好地满足您的需求。
我建议使用空的测试数据库并进行TPT和TPH模型优先设计,并查看EF为您所需的设置构建的模式。
路