Чтобы сделать это правильно в EF4 CodeFirst, нужно иметь в проекте свойство Proposer
типа User
.
После извлечения проекта Proposer будет иметь правильный тип, но значение будет помечено как User
.Чтобы выяснить, какой фактический тип является фактическим, вы можете использовать ключевое слово is
, например:
// project is a Project instance
if (project.Proposer is Lecturer)
{
// do something
} else if (project.Proposer is Student)
{
// do something else
}
. Это структура данных, которую я бы предложил:
public class Tag
{
[Key]
public int ID { get; set; }
}
public abstract class User
{
[Key]
public int ID { get; set; }
public string Forename { get; set; }
public string Surename { get; set; }
}
public class Lecturer : User
{
public IEnumerable<Tag> Forename { get; set; }
}
public class Student : User
{
public IEnumerable<Tag> Forename { get; set; }
}
public class Project
{
[Key]
public int ID { get; set; }
public User Proposer { get; set; }
}
другие способы структурирования, такие как введение иерархии проектов с использованием классов, таких как LecturerProject
StudentProject
и перемещение Proposer
с правильным типом в эти классы, но это не рекомендуется.Так как вам всегда придется обрабатывать эти классы проекта отдельно.Например, при получении названия проекта и его автора.Так как базовый класс проекта больше не имеет свойства proposer, вам необходимо выполнить один и тот же запрос дважды.Я надеюсь, что смогу проиллюстрировать проблемы, возникающие при использовании этого подхода.
Следующий вопрос, который вам нужно задать себе: вас волнует, как данные сохраняются в БД?Так как есть 3 способа сделать это для классов с наследованием:
Одно слово совета.Если вы не планируете хранить миллионы записей, не обращайте внимания на то, как они хранятся в БД.Table per Hierarchy
является самым простым в использовании, особенно в начале, также по умолчанию.