我有一个名为“Users”的表,其中有一个名为“deleted”的列,一个布尔值表示用户已从系统中“删除”(当然没有实际删除它)。
我还有很多对Users.user_id列有FK的表。 Subsonic以类似的方式生成(非常好)所有外键的代码:
public IQueryable<person> user
{
get
{
var repo=user.GetRepo();
return from items in repo.GetAll()
where items.user_id == _user_id
select items;
}
}
虽然这很好,但有没有办法以这样的方式生成代码,以便始终过滤掉“已删除”的用户?
在这里的办公室里,我们能想到的唯一建议就是使用局部类并扩展它。当使用User表有很多很多类时,这显然是一种痛苦,更不用说很容易无意中使用错误的属性(本例中的User vs ActiveUser):
public IQueryable<User> ActiveUser
{
get
{
var repo=User.GetRepo();
return from items in repo.GetAll()
where items.user_id == _user_id and items.deleted == 0
select items;
}
}
有什么想法吗?
答案 0 :(得分:3)
您需要更改ActiveRecord.tt文件中的以下代码并重新生成代码:
以下代码位于:#region ' Foreign Keys '
更新:我已更新您的评论代码,以检查删除列是否可用,然后仅应用删除条件。
HasLogicalDelete()
- 如果table有“deleted”或“isdeleted”列,则此函数将返回true,否则返回false。
public IQueryable<<#=fk.OtherClass #>> <#=propName #>
{
get
{
var repo=<#=Namespace #>.<#=fk.OtherClass#>.GetRepo();
<#if(tbl.HasLogicalDelete()){#>
return from items in repo.GetAll()
where items.<#=CleanUp(fk.OtherColumn)#> == _<#=CleanUp(fk.ThisColumn)#> && items.deleted == 0
select items;
<#}else{#>
return from items in repo.GetAll()
where items.<#=CleanUp(fk.OtherColumn)#> == _<#=CleanUp(fk.ThisColumn)#>
select items;
<#}#>
}
}
答案 1 :(得分:0)
您使用的是Subsonic3吗?如果是这样,那么您可以实际编辑模板以修改数据访问层类的生成方式。