SubSonic生成的代码并始终过滤记录

时间:2010-04-28 06:31:03

标签: subsonic subsonic-active-record

我有一个名为“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;
        }
    }

有什么想法吗?

2 个答案:

答案 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吗?如果是这样,那么您可以实际编辑模板以修改数据访问层类的生成方式。