NHibernate и общий список в абстрактном базовом классе - PullRequest
1 голос
/ 24 июля 2011

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

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

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

По сути, я хотел бы иметь список команд в классе Лиги, чтобы в этом классе я мог иметь более общие методы, которые могут работать только с объектами Команды. И тогда в моей 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?

1 Ответ

1 голос
/ 25 июля 2011
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, чтобы избежать ошибок приведения

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

...