Свободный nHibernate с использованием AsList () возвращает нулевые объекты в зависимости от SortOrder - PullRequest
1 голос
/ 28 июля 2010

В проекте, над которым я работаю, мы используем вкладки.Эти вкладки имеют контент.На вкладке может быть несколько объектов контента.Таким образом, у нас может быть вкладка «автомобиль», и эта вкладка автомобиля может отображать объект содержимого седана, объект содержимого внедорожника и объект содержимого грузовика.Пользователь также может указать, что он содержит больше или меньше этих объектов, и упорядочить их по своему усмотрению.Для нас важно поддерживать порядок этих объектов содержимого в соответствии с пользовательской спецификацией.

Вот мои отображения:

На вкладке Отображение:

    HasManyToMany(t => t.ContentObjects) 
        .Table("TabContentObjects") 
        .ParentKeyColumn("TabID") 
        .ChildKeyColumn("ContentObjectID") 
        .AsList(index => index.Column("SortOrder")); 

НаОтображение ContentObject:

    HasManyToMany(c => c.Tabs) 
        .Table("TabContentObjects") 
        .ParentKeyColumn("ContentObjectID") 
        .ChildKeyColumn("TabID") 
        .Cascade.SaveUpdate() 
        .AsList(index => index.Column("SortOrder")); 

Таблица сопоставления:

TabContentObjectId TabId ContentObjectId SortOrder int not null

Я могу добавить объект содержимого, изменить порядок содержимогообъект внутри вкладки, и все хорошо.nHibernate добавляет / обновляет SortOrder соответственно.Проблема возникает, когда я пытаюсь удалить объект содержимого.Когда я иду, чтобы удалить вкладки из этого contentObject, contentObject.Tabs выглядит странно.

Вот код, который я использую для удаления вкладок:

            //Need to remove each through the contentObject since it is parent 
            foreach (Tab tab in deleteContentObject.Tabs) 
            { 
                tab.RemoveContentObject(deleteContentObject); 
            } 

//in Tab class 
public virtual void RemoveContentObject(TabContentObject item) 
{ 
    if (ContentObjects == null) ContentObjects = new List<TabContentObject>(); 
    ContentObjects.Remove(item); 
} 

Если это ЕДИНСТВЕННЫЙ или первый (SortOrder = 0) объект ContentObject на вкладке, я могу удалить его.Если это второй объект содержимого, contentObject.Tabs выглядит как [0] [null], [1] [Tab].Если это четвертый contentObject на вкладке, contentObject.Tabs выглядит как [0] [null], [1] [null], [2] [null], [3] [Tab].Таким образом, в зависимости от того, что столбец SortOrder находится в таблице ассоциации, я, кажется, возвращаю много пустых ссылок, и поэтому не могу удалить из-за нулевой ссылки.Я не могу понять, почему эти нули возвращаются.Любая помощь будет оценена.

1 Ответ

1 голос
/ 02 августа 2010

Я решил это следующим образом:

Карта вкладок:

        HasManyToMany(t => t.ContentObjects)
            .Table("wfdc_Tab_TabContentObjects")
            .ParentKeyColumn("TabID")
            .ChildKeyColumn("ContentObjectID")
            .Cascade.SaveUpdate()
            .AsList(index => index.Column("SortOrder"));  

Карта объектов содержимого:

        HasManyToMany(c => c.Tabs)
            .Table("wfdc_Tab_TabContentObjects")
            .ParentKeyColumn("ContentObjectID")
            .ChildKeyColumn("TabID")
            .Inverse();

Так что мне нужен был только AsList на одномкарта.Я также сделал вкладку родительской.

Чтобы удалить вкладки:

                foreach (Tab tab in deleteContentObject.Tabs)
                {
                    tab.ContentObjects.Remove(deleteContentObject);
                }

В этой конфигурации содержимое вкладки упорядочено так, как мы хотели бы.Сортировка автоматически обновляется при обновлении, добавлении, удалении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...