Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х / 11 сообщений из 11, страница 1 из 1
05.06.2010, 09:59
    #36670811
Курдль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
Добрый день, коллеги!
Проблема такая - имею 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
05.06.2010, 13:42
    #36670986
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
Ассоциации с двух сторон прописали? Лучше бы маппинги вместо классов выложили.
...
Рейтинг: 0 / 0
05.06.2010, 22:20
    #36671332
Курдль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
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
05.06.2010, 23:19
    #36671385
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
Охо-хо. Имейте уважение к моим седым волосам. Этот код не проглотит даже компилятор.

1. Не понятно, зачем вам велосипед со свойством Project.STATUS_ID?
2. В маппинге класса Project ассоциация со статусом как таковым отсутствует.
...
Рейтинг: 0 / 0
06.06.2010, 00:42
    #36671431
Курдль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
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
06.06.2010, 10:42
    #36671555
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
Курдль
Коллега! Отвечу в порядке значимости (обратном).
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
06.06.2010, 20:29
    #36671936
Курдль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate. Из 3-х зависимых объектов List выдает данные лишь о 2-х
О ужас!
Я и вправду накосячил однажды и не заметил этого в дальнейшем!

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

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

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

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

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

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

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


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