我是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存在,所以我不知道为什么它会给出这个错误。另外,我正在做一个选择,而不是更新,所以这里发生了什么?
感谢您提供任何意见,
贾斯汀
答案 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
,它不在那里使用。