包括继承实体的导航属性

时间:2014-06-24 14:00:31

标签: c# .net entity-framework

我正在使用实体框架,急切加载,我正在尝试加载我的图形的一部分。 我有Candidate和Trainer继承的Person表,当有人,Trainer和Candidate时我有问题(注意:Trainer和Candidate没有任何其他属性,只有从Person继承的主键)。

这是我的疑问:

RequestInfo ri = context.RequestInfo.Include(x => x.Request).Include(x => x.TeamName).Include(x => x.Sender)
                .Include(x => x.TrainingLanguage).Include(x => x.TrainingLocation).Include(x => x.CcPerson.Select(p => p.Person))
                .Include(x => x.Request.Select(c => c.Candidate))
                .Include(x => x.Request.Select(c => c.Candidate).Select(ct => ct.CandidateType))
                .Include(x => x.Request.Select(c => c.Candidate.CandidateType.Select(cwp => cwp.CandidateWorkPresence)))
                .Where(x => x.Id == r.Id).Single();

它可能会更好,但我所遇到的问题是,当某人是候选人和培训师时,我会得到以下异常:

All objects in the EntitySet 'EmployeesTrainingEntities.Person' must have unique primary keys. However, an instance of type 'EmployeesTrainingModel.Candidate' and an instance of type 'EmployeesTrainingModel.Trainer' both have the same primary key value, 'EntitySet=Person;PersonId=5'.

我试图找到问题的解决方案,但我没有运气,我看到很多人都有这个问题。也许我错过了什么,所以如果有人有一些解决方案,建议,......欢迎。 如果有必要,我会添加一张包含我正在尝试加载的模型的一部分的照片。

修改 模型包含RequestInfo实体,该实体具有关于培训请求的公共信息。 RequestInfo包含RequestsSenderPersonCcPersons的集合(将跟随培训的人)的集合。 Request包含Candidate

解决方案: 我发现了问题的解决方案。当我有 Trainer Candidate 的人时,我所做的是继承重叠,似乎 EntityFramework 不允许继承重叠。所以,我用关联替换了继承关系,现在它正常工作。

1 个答案:

答案 0 :(得分:0)

如果他们没有任何其他属性,我没有看到创建两个额外实体的重点。

为什么不编辑Person表,包含PersonRole的enum [flag]属性。这样,您就可以为一个用户分配多个角色,并将它们存储在一个int中。