SubSonic генерирует код и всегда фильтрует записи - PullRequest
2 голосов
/ 28 апреля 2010

У меня есть таблица с именем «Пользователи», в которой есть столбец с именем «удалено», логическое значение, указывающее, что пользователь «удален» из системы (без фактического удаления, конечно).

У меня также есть много таблиц, которые имеют FK для столбца Users.user_id. 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 против 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 ]

3 голосов
/ 28 апреля 2010

Вам нужно изменить следующий код в вашем файле ActiveRecord.tt и восстановить его:

Следующий код находится под: #region ' Foreign Keys '

Обновление: Я обновил код вашего комментария, чтобы проверить, доступен ли столбец удаления, а затем применить только условие удаления.

HasLogicalDelete() - Эта функция вернет true, если в таблице есть столбец «удален» или «isdeleted», в противном случае - 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;

          <#}#>
    }
}
0 голосов
/ 28 апреля 2010

Используете ли вы Subsonic3? Если это так, то вы можете отредактировать шаблоны, чтобы изменить способ генерации классов уровня доступа к данным.

...