MonoRail ActiveRecord - UPDATE语句与FOREIGN KEY SAME TABLE冲突

时间:2010-05-26 20:48:13

标签: castle-activerecord

我是MonoRail和ActiveRecord的新手,并继承了我需要修改的应用程序。我有一个类别表(Id,Name),我正在添加一个ParentId FK,它引用同一个表中的Id,以便您可以拥有父/子类别关系。

我尝试将其添加到我的Category模型类中:

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

我也尝试过这样做:

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

当我调用一个方法获取所有父类别(它们有一个null 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 \“,table \”dbo.Category \“,列'Id'。 r \ n声明已经终止。“

我在parentId参数中硬编码为1,我100%确定它在Category表中作为id存在,所以我不知道为什么它会给出这个错误。另外,我正在做一个选择,而不是更新,所以这里发生了什么?

感谢您提供任何意见,

贾斯汀

1 个答案:

答案 0 :(得分:1)

你只需要这个:

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

删除此属性:

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

当您使用FindAllByProperty()(或任何其他NHibernate / ActiveRecord标准)时,您使用的属性名称是映射属性,而不是表列,因此正确的用法是FindAllByProperty("Parent.Id", parentId),而不是{{ 1}}。 (假设Category具有PK属性FindAllByProperty("ParentId", parentId)

如果在进行查询时看到UPDATE,通常意味着您正在使用自动会话刷新,并且一个或多个会话实体是脏的,因此NHibernate必须刷新会话并更新这些脏实体查询,以确保你没有得到陈旧的结果。

次要挑剔:移除Id,它不在那里使用。