Код, сгенерированный SubSonic, и всегда фильтрующие записи

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

У меня также есть много таблиц, у которых есть 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 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;
        }
    }

Любые идеи?


person cmroanirgo    schedule 28.04.2010    source источник


Ответы (2)


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

Ниже приведен код: #region ' Foreign Keys '

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

HasLogicalDelete() - Эта функция вернет истину, если в таблице есть столбец «удален» или «удален», в противном случае - ложь.

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;

          <#}#>
    }
}
person Krunal    schedule 28.04.2010
comment
Это именно тот ответ, который я искал. Я даже не думал, что у SubSonic это уже есть! - person cmroanirgo; 30.04.2010

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

person Luis    schedule 28.04.2010