Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Коллекция <map/>. Не могу понять смысл аттрибута <index-many-to-many/>. / 11 сообщений из 11, страница 1 из 1
18.06.2013, 15:12
    #38301745
vitach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция <map/>. Не могу понять смысл аттрибута <index-many-to-many/>.
Есть маппинг файл. Пытаюсь в нем разобраться что к чему. С коллекцией что-то не ладное творится, не все значения по запросу из БД выходят. Структура такая:

Код: xml
1.
2.
3.
4.
5.
<map name="Name" inverse="true">
	<key column="FirstID" />
	<index-many-to-many column="OtherID" class="OtherClass" />
	<one-to-many class="AnotherClass" />
</map>



Вообще вопросов несколько. Не хватает знаний то ли в коллекциях, то ли еще в чем. Не могу понять зачем нужны индексы. Т.е. index-many-to-many с левой сущностью в структуре. Ускоряет поиск? Насколько я понимаю, map должен содержать в себе ключ (FirstID) и значение (AnotherClass). Шо за индексы тут появились не понимаю. Читал маннуал по хибернейту и по nhibernate, но там настолько сухо все написано... inverse="true" - что за зверь еще интересует..
...
Рейтинг: 0 / 0
18.06.2013, 15:55
    #38301855
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция <map/>. Не могу понять смысл аттрибута <index-many-to-many/>.
vitach,

index-many-to-many - подробнее читайте у Ayende .
Inverse показывает, по какой стороне двусторонней ассоциации хибер будет определять живучесть ассоциации. Позволяет избежать лишнего update при сохранении сущности.
...
Рейтинг: 0 / 0
26.06.2013, 14:04
    #38311243
vitach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция <map/>. Не могу понять смысл аттрибута <index-many-to-many/>.
В общем проблема там с хешированием Iesi.Collections.SortedSet. Алгоритм хеширования от Iesi считает хэш как-то по-своему и не все элементы выдергиваются из базы. Попробовал заменить на стандартный HashSet от System.Collections он работает нормально, но теперь при добавлении значений в коллекцию не обновляется число элементов, транзакции находятся внутри BeginTransaction() и transaction.Commit. Грешу на то что для работы хибера нужен все-таки Iesi. Как решить проблему с хешированием?
...
Рейтинг: 0 / 0
26.06.2013, 14:47
    #38311333
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция <map/>. Не могу понять смысл аттрибута <index-many-to-many/>.
vitach,

как переопределили Equals() и GetHashCode()?
...
Рейтинг: 0 / 0
27.06.2013, 14:38
    #38312694
vitach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция <map/>. Не могу понять смысл аттрибута <index-many-to-many/>.
SolYUtor,
Не переопределял ничего... В классе есть свойство:
Код: c#
1.
private IDictionary<CurriculumSubject, SubjectCourse> subjectCourses;


И функция:
Код: c#
1.
2.
3.
4.
public virtual IEnumerable<SubjectCourse> GetSubjectCourses() 
{
	return new SortedSet<SubjectCourse>(subjectCourses.Values, new SubjectCourseSorter());
}


Я функцию заменил на:
Код: c#
1.
2.
3.
4.
public virtual HashSet<SubjectCourse> GetSubjectCourses() 
{
	return new HashSet<SubjectCourse>(subjectCourses.Values);
}
...
Рейтинг: 0 / 0
27.06.2013, 14:52
    #38312722
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция <map/>. Не могу понять смысл аттрибута <index-many-to-many/>.
vitachНе переопределял ничего... В классе есть свойство:
Это и есть ошибка. Чтобы словари и хеш-сеты работали правильно, вы должны переопределять Equals и GetHashCode. Рекомендую посмотреть, как это сделано здесь .
...
Рейтинг: 0 / 0
27.06.2013, 14:59
    #38312737
vitach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция <map/>. Не могу понять смысл аттрибута <index-many-to-many/>.
SolYUtor,

Спасибо, будем разбираться :)
...
Рейтинг: 0 / 0
28.06.2013, 13:17
    #38313947
vitach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция <map/>. Не могу понять смысл аттрибута <index-many-to-many/>.
SolYUtor,
Переопределил указанные функции. Хэш теперь правильно вычисляется. Но вот проблема одна осталась не понятная мне. Как я уже писал выше функция в классе выглядит так:
Код: c#
1.
2.
3.
4.
public virtual IEnumerable<SubjectCourse> GetSubjectCourses() 
{
	return new SortedSet<SubjectCourse>(subjectCourses.Values, new SubjectCourseSorter());
}



Соответственно SubjectCourseSorter вот такой:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class SubjectCourseSorter : IComparer<SubjectCourse> {

		public int Compare(SubjectCourse x, SubjectCourse y) {
			String[] code1 = x.Code.Split('.');
			String[] code2 = y.Code.Split('.');
			return int.Parse(code1[code1.Length-1])
				.CompareTo(int.Parse(code2[code2.Length-1]));
		}
	}


Code представляет собой строку типа "ОПД.Ф.20" и всегда заканчивается числом. Так вот если у элементов этот код одинаковый, то функция вставляет только один обьект в SortedSet из всех элементов с таким кодом. Если я возвращаю HashedSet вместо SortedSet, который тоже от Iesi, то все норм...
...
Рейтинг: 0 / 0
28.06.2013, 14:40
    #38314079
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция <map/>. Не могу понять смысл аттрибута <index-many-to-many/>.
vitachCode представляет собой строку типа "ОПД.Ф.20"Учебный план второго поколения?
...
Рейтинг: 0 / 0
28.06.2013, 15:17
    #38314158
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция <map/>. Не могу понять смысл аттрибута <index-many-to-many/>.
vitach,

vitachCode представляет собой строку типа "ОПД.Ф.20" и всегда заканчивается числом. Так вот если у элементов этот код одинаковый, то функция вставляет только один обьект в SortedSet из всех элементов с таким кодом. Если я возвращаю HashedSet вместо SortedSet, который тоже от Iesi, то все норм...
Set'ы - это коллекции уникальных элементов. Соответственно, если SubjectCourseSorter говорит что дав объекта равны, один из них будет выкинут как дубликат. Так что или дополняйте SubjectCourseSorter уникальностью для одного кода, или используйте другой Set. Для вашего метода я бы посоветовал ImmutableSet из Iesi.Collections.
...
Рейтинг: 0 / 0
01.07.2013, 07:12
    #38315343
vitach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коллекция <map/>. Не могу понять смысл аттрибута <index-many-to-many/>.
Antonariy,
Типа того :)

SolYUtor,
Хмм.. А я думал что Sorter нужен чисто для сортировки..
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Коллекция <map/>. Не могу понять смысл аттрибута <index-many-to-many/>. / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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