powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Не подтягивается коллекция дочерних объектов
2 сообщений из 2, страница 1 из 1
Не подтягивается коллекция дочерних объектов
    #37975002
Alexus_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Возникла проблема, хотя все делаю вроде как надо. Возможно проблема в том, что слишком сложная организация получилась.
Сохранение, получение сущностей без дочерних коллекций работает.

Проблема заключается в том, что я не могу получить дочернюю коллекцию родительского объекта. Получаю ошибку

could not initialize a collection: [RealEstateDirectory.Domain.Entities.Dictionaries.District.Streets#65539][SQL: SELECT streets0_."District" as column1_1_, streets0_."Id" as column1_0_0_, streets0_."Name" as column2_0_0_, streets0_."District" as column1_17_0_ FROM "Street" streets0_ WHERE streets0_."District"=?]
InnerException
The value "RealEstateDirectory.Domain.Entities.Dictionaries.District" is not of type "RealEstateDirectory.Domain.Entities.Dictionaries.Street" and cannot be used in this generic collection.
Parameter name: value

А теперь описание всего.
БД
PostgreSQL 9.1.5, compiled by Visual C++ build 1500, 64-bit
NHibernate 3.3.1.4000

Сущности:

Общий базовый класс
Код: c#
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
    public abstract class Entity<TId>
    {
        public virtual TId Id { get; protected set; }

        private static bool IsTransient(Entity<TId> obj)
        {
            return obj as object != null &&
            Equals(obj.Id, default(TId));
        }

        /// <summary>
        /// Работает как private только из-под CastleProxy. Из-под LinFu требует public (protected) virtual
        /// </summary>
        protected virtual Type GetUnproxiedType()
        {
            return GetType();
        }

        protected virtual bool EqualsById(Entity<TId> other)
        {
            if (other as object == null)
                return false;
            if (ReferenceEquals(this, other))
                return true;
            if (!IsTransient(this) &&
            !IsTransient(other) &&
            Equals(Id, other.Id))
            {
                var otherType = other.GetUnproxiedType();
                var thisType = GetUnproxiedType();

                return thisType.IsAssignableFrom(otherType) ||
                otherType.IsAssignableFrom(thisType);
            }

            return false;
        }

        public static bool operator ==(Entity<TId> entity1, Entity<TId> entity2)
        {
            if (entity1 as object == null)
            {
                return (entity2 as object == null);
            }
            else
            {
                return entity1.Equals(entity2);
            }
        }

        public static bool operator !=(Entity<TId> object1, Entity<TId> object2)
        {
            return !(object1 == object2);
        }

        /// <summary>
        /// Попытаться привести внутренний объект прокси (или сам объект, если прокси нет) к заданному типу.
        /// Работает аналогично операции as, т.е. возвращает null, если приведение невозможно.
        /// </summary>
        public virtual T As<T>() where T : class
        {
            return this as T;
        }

        /// <summary>
        /// Проверить, возможно ли привести внутренний объект прокси (или сам объект, если прокси нет) к заданному типу.
        /// </summary>
        public virtual bool Is<T>() where T : class
        {
            return this is T;
        }
    }



базовый класс сущностей
Код: c#
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.
    /// <summary>
    /// Типовой справочник
    /// </summary>
    public abstract class BaseDictionary : Entity<int>
    {
        #region Свойства

        /// <summary>
        /// Наименование элемента
        /// </summary>
        public virtual string Name { get; set; }

        #endregion

        #region Конструкторы

        protected BaseDictionary()
        {
        }

        public BaseDictionary(string name)
        {
            Name = name;
        }

        #endregion
    }



Основная сущность
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    /// <summary>
    /// Район, регион
    /// </summary>
    public class District : BaseDictionary
    {
        /// <summary>
        /// Улицы района
        /// </summary>
        public virtual IList<Street> Streets { get; set; }

        protected District()
        {
        }

        public District(string name)
            : base(name)
        {
        }
    }



Дочерняя коллекция
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    public class Street : BaseDictionary
    {
        /// <summary>
        /// Район
        /// </summary>
        public virtual District District { get; set; }

        protected Street()
        {
        }

        public Street(string name, District district)
            : base(name)
        {
            District = district;
        }
    }




Мапинги кодом

Маппинг базового класса
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class BaseDictionaryMap : ClassMapping<BaseDictionary>
	{
        public BaseDictionaryMap()
		{
			Id(x => x.Id, m => m.Generator(Generators.HighLow));
			Property(x => x.Name, m=>
			                          {
			                              m.NotNullable(true);
                                          m.Length(2048);
                                          m.Unique(true);
			                          });
		}
	}



Маппинги сущностей
Код: c#
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.
public class StreetMap : UnionSubclassMapping<Street>
    {
        public StreetMap()
        {


            ManyToOne(x => x.District, r =>
                                           {
                                               r.Cascade(Cascade.All | Cascade.None | Cascade.Persist | Cascade.Remove);
                                               r.Update(true);
                                               r.Insert(true);
                                               r.NotNullable(true);
                                               //r.Class(typeof(District));
                                           });
        }
    }

public class DistrictMap : UnionSubclassMapping<District>
    {
        public DistrictMap()
        {

            Bag(x => x.Streets, c =>
                                    {
                                        //c.Inverse(true);
                                        c.Lazy(CollectionLazy.NoLazy);
                                    },
                r =>
                    {
                        r.OneToMany(m =>
                                        {
                                            m.Class(typeof (Street));

                                        }
                            );

                    }
                );


        }
    }




И собственно, код

Код репозитория для получения сущности
Код: c#
1.
2.
3.
4.
5.
6.
7.
public class RepositoryWithTypedIdBase<TId> : IRepositoryWithTypedId<TId>
    {
public IEnumerable<T> GetAll<T>()
        {
            return CurrentSession.Query<T>().ToList();
        }
}



После кучи шаблонов и наследований в конечном итоге T подставляется и вызывается так,
Код: c#
1.
var districtServiceEntities = districtService.GetAll();


в момент обращения к упомянутому выше методу репозитория, T имеет нужный тип District



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

Буду очень благодарен за помощь!
Заранее спасибо!
...
Рейтинг: 0 / 0
Не подтягивается коллекция дочерних объектов
    #37975872
Alexus_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UP

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

Мапинг:


Код: c#
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
public class StreetMap : ClassMapping<Street>
    {
        public StreetMap()
        {
            Id(x => x.Id, m => m.Generator(Generators.HighLow));
            Property(x => x.Name, m =>
            {
                m.NotNullable(true);
                m.Length(2048);
                m.Unique(true);
            });
            ManyToOne(x => x.District, r =>
                                           {
                                               r.Cascade(Cascade.All | Cascade.None | Cascade.Persist | Cascade.Remove);
                                               r.Update(true);
                                               r.Insert(true);
                                               r.NotNullable(true);
                                               r.Class(typeof(District));
                                           });
        }
    }

public class DistrictMap : ClassMapping<District>
    {
        public DistrictMap()
        {
            Id(x => x.Id, m => m.Generator(Generators.HighLow));
            Property(x => x.Name, m =>
            {
                m.NotNullable(true);
                m.Length(2048);
                m.Unique(true);
            });

            Bag(x => x.Streets, c =>
                                    {
                                        c.Inverse(true);
                                        c.Lazy(CollectionLazy.NoLazy);
                                    },
                r =>
                    {
                        r.OneToMany(m =>
                                        {
                                            m.Class(typeof (Street));
                                        }
                            );

                    }
                );
        }
    }



Предлагаю обсудить почему так. Баг или не достаточно тонкая натсройка?
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Не подтягивается коллекция дочерних объектов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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