Свободное отображение NHibernate 2 идентичных класса для одного стола, первый ленивый, второй ленивый выключен - PullRequest
2 голосов
/ 30 декабря 2010

Итак, мне нужно сопоставить мой класс с таблицей базы данных, но иногда мне нужна ленивая загрузка, иногда выключенная.

Пример: Я сделал дубликаты этих двух классов, описанных ниже, и отображаю их, используя FNH, но с отложенной загрузкой в ​​оригинале и выключением в дубликате.

http://i.stack.imgur.com/goG30.png

В принципе, я хочу иметь возможность получить команду из БД, у которой есть все списки с TeamMembers, но у этих участников не должно быть всех своих команд и всего остального, просто простая информация о TeamMember. Также, когда я получаю TeamMember из БД, я хочу, чтобы все его команды содержали только простую информацию.

"http://i.stack.imgur.com/7OkyD.png" -> они не позволяют новым пользователям размещать фотографии или ссылки.

Так что, если у меня есть только эти два класса, то, если с любой стороны включена отложенная загрузка, одна из ситуаций, описанных ранее, не выполняется. Если ленивый выключен с обеих сторон, я получаю кучу данных, которые мне не нужны и не нужны.

Сначала оригинал и дубликат имели одинаковые имена и были в разных пакетах, но я получил исключение, что отображение было неоднозначным. Если есть способ, чтобы это работало, это было бы идеально. Есть ли способ сделать это?

Мне не удалось найти ответ, поэтому я изменил имя дубликата на NameOfOriginal + Lite. Картографирование было проанализировано, но когда я хотел получить команду из базы данных, я получил исключение:

{"ORA-00904: \" SUPERVIZ _ \ ". \" TEAMMEMBERLITE_ID \ ": неверный идентификатор \ n"}

Итак, очевидно, что FNH читает имя класса и объявляет «_ID» и использует его в качестве идентификатора для моего дублированного класса, и это вызывает проблему. Я пробовал с .ParentKeyColumn ( "") .ChildKeyColumn ( "") но безуспешно.

Надеюсь, я вас не слишком смутил:)

    [DataContract]
    public class Team
    {
            [DataMember]
            public virtual int Team_id { get; private set; }

            [DataMember]
            public virtual String Name { get; set; }

            [DataMember]
            public virtual String Description { get; set; }

            [DataMember]
            public virtual TeamMember Deputy { get; set; }

            [DataMember]
            public virtual TeamMember Leader { get; set; }

            [DataMember]
            public virtual IList<TeamMember> TeamMembers { get; set; }

            [DataMember]
            public virtual IList<TeamMember> Supervizors { get; set; }
    ...
    }


    [DataContract]
    public class TeamMember
    {
            [DataMember]
            public virtual int TeamMember_id { get; set; }

            [DataMember]
            public virtual String First_name { get; set; }

            [DataMember]
            public virtual String Last_name { get; set; }

            [DataMember]
            public virtual String Sid { get; set; }

            [DataMember]
            public virtual IList<Team> SupevisingTeams { get; set; }

            [DataMember]
            public virtual IList<Team> LeaderInTeams { get; set; }

            [DataMember]
            public virtual IList<Team> DeputyInTeams { get; set; }

            [DataMember]
            public virtual IList<Team> MemberInTeams { get; set; }
    ...
    }

1 Ответ

0 голосов
/ 26 сентября 2012

Вы можете отобразить класс несколько раз, если вы дадите сопоставлению имя объекта.Вам нужно будет использовать ClassMap для этого, а не для автоматического сопоставления.

Использование Fluent NHibernate:

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class FooMap1 : ClassMap<Foo>
{
    public FooMap1()
    {
        Table("Foo");
        EntityName("Foo");
        Id(x => x.Id);
        Map(x => x.Name);
    }
}

public class FooMap2 : ClassMap<Foo>
{
    public FooMap2()
    {
        Table("Foo");
        EntityName("Bar");
        Id(x => x.Id);
        Map(x => x.Name);
    }
}

При создании запроса необходимо указать имя сущности, чтобы nhibernate использовалправильное отображение:

using (var session = _sessionFactory.GetCurrentSession())
{
   return session.CreateCriteria("Bar")
      .Add(Restrictions.Eq("Name", "Andrew"))
      .List<Foo>();
}
...