У меня есть приложение, которое имеет концепцию Venue
, место, где происходят события. A Venue
имеет много VenuePart
s. Итак, это выглядит так:
public abstract class Venue
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<VenuePart> VenueParts { get; set; }
}
A Venue
может быть GolfCourseVenue
, то есть Venue
, имеющим наклон и определенный тип VenuePart
, называемый HoleVenuePart
:
public class GolfCourseVenue : Venue
{
public string Slope { get; set; }
public virtual ICollection<HoleVenuePart> Holes { get; set; }
}
В будущем могут быть и другие виды Venue
s, которые все наследуются от Venue
. Они могут добавлять свои собственные поля и всегда будут иметь VenuePart
своего собственного специфического типа.
Вот классы VenuePart
:
public abstract class VenuePart
{
public int Id { get; set; }
public string Name { get; set; }
public abstract string NameDescriptor { get; }
}
public class HoleVenuePart : VenuePart
{
public override string NameDescriptor { get { return "Hole"; } }
public int Yardage { get; set; }
}
Мои объявления выше кажутся неправильными, потому что теперь у меня есть GolfCourseVenue
с двумя коллекциями, тогда как на самом деле он должен иметь только одну. Я не могу переопределить это, потому что тип отличается, верно? Когда я запускаю отчеты, я хотел бы ссылаться на классы в общем, где я просто выплевывал Venue
с и VenuePart
с. Но когда я рисую формы и тому подобное, я бы хотел быть конкретным.
У меня много таких отношений, и мне интересно, что я делаю неправильно. Например, у меня есть Order
, который имеет OrderItem
с, но также есть определенные виды Order
с, которые имеют определенные виды OrderItem
с.
Обновление: Следует отметить, что эти классы являются сущностями Entity Framework Code-First. Я надеялся, что это не будет иметь значения, но я думаю, что это может. Мне нужно структурировать классы таким образом, чтобы Code-First мог правильно создавать таблицы. Не похоже, что Code-First может обрабатывать дженерики. Извините, эта деталь реализации мешает элегантному решению: /
Обновление 2: Кто-то связался с поиском, который указывал на Ковариантность и Контравариантность , который, по-видимому, был способом ограничения списков внутри подтипов самими для данного подтипа. Это кажется действительно многообещающим, но человек удалил свой ответ! У кого-нибудь есть информация о том, как я могу использовать эти понятия?
Обновление 3: Удалены свойства навигации, которые были в дочерних объектах, потому что это сбивало с толку людей и не помогало описать проблему.