NHibernate и общий список в абстрактном базовом классе

Это своего рода сложный вопрос, и я пробовал так много углов, что не могу вспомнить, что у меня было, и что я еще не пробовал. Но в основном мой проект состоит из базовых классов футбольной лиги. У меня есть следующие занятия:

Лига - абстрактный базовый класс для лиги в моей библиотеке Команда - абстрактный базовый класс для команды в моей библиотеке

FootballLeague - производный от League (может быть любой другой тип лиги, например, BaseballLeague, SoccerLeague и т. Д.) FootballTeam - производный от Team (то же, что и выше)

По сути, я хотел бы иметь список команд в классе League, чтобы у меня были более общие методы в этом классе, которые могли бы работать только с объектами Team. А затем в моем FootballLeague иметь возможность ссылаться на тот же список, за исключением возврата объектов FootballTeam (которые действительно содержатся в списке).

Вот моя реализация на очень базовом уровне:

public abstract class League
{
   protected IList mTeams;
}

public abstract class Team
{
   public virtual League League
   {
       get;
       protected set;
   }
}

public class FootballLeague : League
{
        public virtual IList<FootballTeam> Teams
        {
            get { return this.mTeams.Cast<FootballTeam>().ToList(); }
            protected set { this.mTeams = value.ToList(); }
        }

        public FootballLeague() : base()
        {
            this.mTeams = new List<FootballTeam>();
            this.mConferences = new List<FootballConference>();
        }
}

Это работает практически так, как я хочу, за исключением проблемы с NHibernate.

1) Когда я загружаю объект FootballLeague, он также загружает все объекты FootballTeam. Если я удалю объявление mTeams в базовом классе и просто использую автоматическое получение / установку для IList в объекте FootballLeague, ленивая загрузка сработает, и мои команды не загрузятся, пока не получат доступ к коллекции. Таким образом, наличие этой переменной-члена, к которой список обращается в базовом классе, заставляет NHiberate обходить ленивую загрузку.

Эта реализация - это то, как вы бы справились с этим типом библиотеки. В то время как у вас есть абстрактные базовые классы, которые должны иметь функциональные возможности в списках, но производные классы также должны иметь доступ к более специализированным версиям списка? Если нет, как мне это реализовать, чтобы он работал с NHibernate?


person Nate32    schedule 23.07.2011    source источник


Ответы (1)


public abstract class League<T> where T : Team
{
    protected IList<T> mTeams;

    public League()
    {
        mTeams = new List<T>();
    }
}

public class FootballLeague : League
{
}

и сопоставьте mTeams как IList и hasmanyToAny, чтобы избежать ошибок приведения

Это работает для вас?

person Firo    schedule 25.07.2011