MonoRail ActiveRecord - оператор UPDATE вступил в конфликт с FOREIGN KEY SAME TABLE - PullRequest
0 голосов
/ 27 мая 2010

Я новичок в MonoRail и ActiveRecord и унаследовал приложение, которое мне нужно изменить. У меня есть таблица категорий (Id, Name), и я добавляю FK ParentId, который ссылается на Id в той же таблице, чтобы вы могли иметь отношения родительских / дочерних категорий.

Я пытался добавить это в свой класс модели категории:

[Property] 
public int ParentId { get; set; }

Я тоже пытался сделать это так:

[BelongsTo("ParentId")] 
public Category Parent { get; set; }

Когда я вызываю метод, чтобы получить все родительские категории (они имеют нулевой ParentId), он отлично работает:

public static Category[] GetParentCategories() 
        { 
            var criteria = DetachedCriteria.For<Core.Models.Category>(); 
            return (FindAllByProperty("ParentId", null)); 
        }

Однако, когда я вызываю метод для получения всех дочерних категорий в определенной категории, он выдает ошибку:

public static Category[] GetChildCategories(int parentId) 
        { 
            var criteria = DetachedCriteria.For<Core.Models.Category>(); 
            return (FindAllByProperty("ParentId", parentId)); 
        }

Ошибка:

"Оператор UPDATE конфликтовал с ограничением FOREIGN KEY SAME TABLE \" FK_Category_ParentId \ ". Конфликт произошел в базе данных \" UCampus \ ", таблице \" dbo.Category \ ", столбце" Id ". \ r \ nУказание было прекращено. "

Я жестко запрограммировал в параметре parentId значение 1, и я на 100% уверен, что он существует в виде идентификатора в таблице категорий, поэтому я не знаю, почему он выдает эту ошибку. Кроме того, я делаю выбор, а не обновление, так что здесь происходит?

Спасибо за любой вклад по этому вопросу,

Justin

1 Ответ

1 голос
/ 27 мая 2010

Вам нужен только этот:

[BelongsTo("ParentId")] 
public Category Parent { get; set; }

Удалить это свойство:

[Property] 
public int ParentId { get; set; }

Когда вы используете FindAllByProperty() (или любые другие критерии NHibernate / ActiveRecord), имя свойства, которое вы используете, является сопоставленным свойством, а не столбцом таблицы, поэтому правильное использование - FindAllByProperty("Parent.Id", parentId), а не FindAllByProperty("ParentId", parentId). (при условии, что Категория имеет свойство PK Id)

Если вы видите UPDATE при выполнении запроса, это обычно означает, что вы используете автоматическую очистку сеанса, и одна или несколько ваших сущностей сеанса загрязнены, поэтому NHibernate должен очистить сеанс и ОБНОВИТЬ эти грязные сущности перед запрос, чтобы убедиться, что вы не получите устаревшие результаты.

Незначительный придира: удалите DetachedCriteria, он там не используется.

...