powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
11 сообщений из 11, страница 1 из 1
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
    #36670811
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги!
Проблема такая - имею 3 взаимосвязанных класса, вроде бы правильно замапленных (+ HasMany).
Вызов коллекции "зависимого" класса нормально выдает список связанных объектов.
Вызов экземпляра "главенствующего" объекта выдает null.
Рассмотрим на простейшем примере.
Модель данных:

TASK --> PROJECT --> STATUS

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
public class STATUS
{
    protected STATUS() {}
    public virtual int int ID { get; protected set: }
    public virtual int string TITTLE { get; set: }
    public virtual ISet<PROJECT> { get; protected set: }
    public STATUS() 
    {
        Projects = new HashedSet<PROJECT>();
    }
}
//-------------------------------------------------------------
public class PROJECT
{
    protected PROJECT() {}
    public virtual int int ID { get; protected set: }
    public virtual int string NAME { get; set: }
    public virtual int int STATUS_ID { get; set: }
    public virtual ISet<TASK> { get; protected set: }
    public virtual STATUS Status { get; protected set: }
    public PROJECT(STATUS status) 
    {
        status.Projects.Add(this);
        Status = status;
        Tasks = new HashedSet<TASK>();
    }
}
// Таким же образом оформлен класс TASK -----------------------


/* Метод:*/ 
IList<PROJECT> result = session.CreateCriteria(typeof(PROJECT)).List<PROJECT>();// отрабатывает нормально. 
/*обращение*/ result.Tasks // выдает список связанных объектов TASK
/*обращение*/ result.Status // выдает null

/* Однако если выполнить метод:*/ 
IList<STATUS> result = session.CreateCriteria(typeof(STATUS)).List<STATUS>();// 
/*обращение*/ result.Projects // выдает список связанных объектов PROJECT

Вот этот null меня шибко беспокоит...
...
Рейтинг: 0 / 0
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
    #36670986
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ассоциации с двух сторон прописали? Лучше бы маппинги вместо классов выложили.
...
Рейтинг: 0 / 0
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
    #36671332
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorАссоциации с двух сторон прописали? Лучше бы маппинги вместо классов выложили.

Ок!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
public class STATUSMap()
{
  Table("STATUSES");
  Id( x => x.ID)GeneratedBy.Native(SEQ_STATUS);
  Map( x => x.TITTLE).Column("TITTLE");

  HasMany( x => x.Projects)
      .KeyColumn("STATUS_ID")
      .Inverse()
      .Cascade.AllDeleteOrphan();
}

public class PROJECTMap()
{
  Table("PROJECTS");
  Id( x => x.ID)GeneratedBy.Native(SEQ_PROJECT);
  Map( x => x.NAME).Column("NAME");
  Map( x => x.STATUS_ID).Column("STATUS_ID");

  HasMany( x => x.Tasks)
      .KeyColumn("PROJECT_ID")
      .Inverse()
      .Cascade.AllDeleteOrphan();
}

// TASK - таким же образом
...
Рейтинг: 0 / 0
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
    #36671385
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Охо-хо. Имейте уважение к моим седым волосам. Этот код не проглотит даже компилятор.

1. Не понятно, зачем вам велосипед со свойством Project.STATUS_ID?
2. В маппинге класса Project ассоциация со статусом как таковым отсутствует.
...
Рейтинг: 0 / 0
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
    #36671431
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorОхо-хо. Имейте уважение к моим седым волосам. Этот код не проглотит даже компилятор.

1. Не понятно, зачем вам велосипед со свойством Project.STATUS_ID?
2. В маппинге класса Project ассоциация со статусом как таковым отсутствует.
Коллега! Отвечу в порядке значимости (обратном).
2. Я действительно упустил связь проекта со статусом:
Код: plaintext
1.
2.
References(x => x.Status)
                .Column("STATUS_ID")
                .Cascade.All();
1. Про велосипед - не понял. Прошу меня извинить - в ORM я пока не силен (как видите - из-за скудости публикуемой литературы вынужден побираться на форумах).
0. У нас что, разный компилятор? Мой проглотил бы (вроде я не нашел катастрофических ошибок, хоть печатал от балды).
Не хватает
Код: plaintext
 : ClassMap<PROJECT>
?
...
Рейтинг: 0 / 0
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
    #36671555
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль
Коллега! Отвечу в порядке значимости (обратном).
2. Я действительно упустил связь проекта со статусом:
Код: plaintext
1.
2.
References(x => x.Status)
                .Column("STATUS_ID")
                .Cascade.All();


Если ассоциация на стороне Project'a не замаплена - то NHibernate и не подумает искать Status.

Курдль
1. Про велосипед - не понял. Прошу меня извинить - в ORM я пока не силен (как видите - из-за скудости публикуемой литературы вынужден побираться на форумах).
Прочитайте NNibernate In Action. Там хорошо разжёван NHibernate.

Курдль
0. У нас что, разный компилятор? Мой проглотил бы (вроде я не нашел катастрофических ошибок, хоть печатал от балды).
Не хватает
Код: plaintext
 : ClassMap<PROJECT>
?

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

В общем если исправить все ошибки, и замапить Project.Status, то всё замечательно работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
[TestFixture]
    public class Test4Forum
    {
        [SetUp]
        public void CreateConfiguration()
        {
            SessionFactory =
                Fluently
                    .Configure()
                    .Database(SQLiteConfiguration.Standard.UsingFile("Test4Forum"))
                    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Project>())
                    .ExposeConfiguration(config => new SchemaExport(config).Create(false, true))
                    .BuildSessionFactory();
        }

        protected ISessionFactory SessionFactory { get; set; }

        [Test]
        public void TestProjectStatus()
        {
            var status = new Status {Tittle = "Status"};
            var project1 = new Project(status) {Name = "Projet1"};
            var project2 = new Project(status) {Name = "Project2"};

            using (var session = SessionFactory.OpenSession())
            using (session.BeginTransaction())
            {
                session.SaveOrUpdate(status);
                session.SaveOrUpdate(project1);
                session.SaveOrUpdate(project2);
                session.Transaction.Commit();
            }
            
            using (var session = SessionFactory.OpenSession())
            {
            var projects = session.CreateCriteria(typeof (Project)).List<Project>();
                foreach (var project in projects)
                {
                    Assert.IsNotNull(project.Status);
                }
            }
        }
    }
...
Рейтинг: 0 / 0
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
    #36671936
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О ужас!
Я и вправду накосячил однажды и не заметил этого в дальнейшем!

SolYUtor, Спасибо!
Книжку, указанную Вами, я имею. Но пролистал ее по диагонали. К сожалению мой Английский превращает изучение материала на языке автора из развлечения в труд.
Надо взять себя в руки и проштудировать.

Коллега! Вы производите впечатление специалиста, стремящегося к фундаментальному подходу.
Так скажите же, в чем сила NHibernate в частности и ORM в целом?
Действительно ли переход от традиционного метода к ней сулит повышение производительности производства ПО и его качества?
...
Рейтинг: 0 / 0
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
    #36672062
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльО ужас!
Так скажите же, в чем сила NHibernate в частности и ORM в целом?
Действительно ли переход от традиционного метода к ней сулит повышение производительности производства ПО и его качества?

Вы задаёте слишком сложный вопрос, который трудно рассмотреть одним человеком в рамках одного топика ))

Сила ORM - в уменьшении зависимости кода классов модели от инфраструктуры сохраняемости, и как следствие их упрощение. А простые классы легче поддерживать и тестировать. Но если у вас не в ходу TDD/BDD, непрерывная интеграция и "традиционная" архитектура "Большая Куча Кода" - вам от этого легче не станет.

На производительность и качество влияют множество архитектурных, инфраструктурных и административных факторов. И NHibernate может стать всего лишь одним из них.
...
Рейтинг: 0 / 0
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
    #36672173
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorНо если у вас не в ходу TDD/BDD, непрерывная интеграция и "традиционная" архитектура "Большая Куча Кода" - вам от этого легче не станет.

До TDD/BDD мы еще не доросли, но "кучу кода" уже переросли.
Перестроить процесс производства непросто...
Для кого оптимален BDD? Для софтверных компаний, пишущих на заказ, выпускающих коробочные продукты, или IT подразделений холдингов, автоматизирующих собственный бизнес?
Кто должен изъявить волю для перехода на BDD?
...
Рейтинг: 0 / 0
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
    #36672762
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль
Для кого оптимален BDD? Для софтверных компаний, пишущих на заказ, выпускающих коробочные продукты, или IT подразделений холдингов, автоматизирующих собственный бизнес?
Кто должен изъявить волю для перехода на BDD?

TDD/BDD оптимален для любых программистов, которые хотят выпускать качественный продукт, и намереваются осуществлять его поддержку и развитие в будущем. Ошибок и нервотрёпки будет существенно меньше.
Решение о переходе на разработку через тестирование принимает уполномоченное лицо. Архитектор проекта например, или ведущий программист. И всех остальных приучает к тестированию. Если вы не это лицо - то можете ознакомиться с трудами Кента Бека, набраться аргументов, и пропиарить TDD у оного лица.
...
Рейтинг: 0 / 0
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
    #36672901
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor
Решение о переходе на разработку через тестирование принимает уполномоченное лицо. Архитектор проекта например, или ведущий программист. И всех остальных приучает к тестированию. Если вы не это лицо - то можете ознакомиться с трудами Кента Бека, набраться аргументов, и пропиарить TDD у оного лица.
Боюсь, что архитектором тут не обойтись.
TDD на первый взгляд может ввести в заблуждение, что он является епархией разработчиков + тестировщиков.
Здесь более показателен BDD (а он во многом перекликается с TDD), как технология, позволяющая максимально отфильтровывать ошибки уровня бизнес логики - ошибки в постановке задач и их понимания разработчиками . (Ошибки кодирования уж мы как-нибудь сами отловим!). Таким образом проблема оказывается шире - она выходит за рамки подразделений, производящих ПО. Она охватывает проектировщиков, аналитиков, технологов и даже уполномоченных представителей заказчиков. Ведь подвергаются изменению процессы и документы по формированию требований и стадиям их воплощения.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]