2011-12-20 3 views
3

У меня есть две таблицы, как показано в следующем примере, в MSSQL db.Фильтрация результатов LINQ на основе «удаленных» флагов

PROJECT 
id 
startDate 
endDate 

STORY 
id 
project_id 
description 
deleted_flag 

В логике моего приложения, я не хочу, чтобы пользователи могли по-настоящему «удалить» объект, но я хочу, чтобы дать им эту иллюзию. В результате «deleted_flag» устанавливается в true, как только история удаляется.

Все это хорошо, но при использовании LINQ to SQL у меня проблема с шаблоном проектирования.

Я использую шаблон репозитория, а в моем хранилище объектов Story мой метод «FindAll()» содержит фильтр Where (s =>! S.deleted_flag), так что, когда список Истории извлекается пользователем, он показывает только неиспользуемые.

У меня есть проблема, является обеспечение соблюдение этого во всей системе = Проблема заключается в том, что из-за достижимости от родительского объекта в LINQ можно получить нефильтрованные коллекции, просто используя

Event e = EventsRepository.FindWithID(1); 
var stories = e.Storys; 

Это было разрешить вызывающему абоненту просматривать даже удаленные объекты.

Что было бы рекомендуемым способом борьбы с этим?

аК

ответ

3

Создать вид довольно много ту же схему строки как таблицы, но в том числе статьи Где:

Create View vwStory 
AS 
SELECT id, project_id, description, deleted_flag 
WHERE deleted_flag = 0 

Измените атрибут рассказа класса [Table] так, что он использует эту точку зрения, а чем таблица.

Добавить INSTEAD OF триггеры в представление, чтобы вставки и обновления передавались в таблицу (вы даже можете удалить, установите флаг вместо удаления строк).

Linq будет обрабатывать его так же, как и таблицу, с соответствующими запросами выбора, обновления, вставки и удаления, но база данных будет выполнять их в соответствии с определением этого представления.

+0

Имеет смысл, время, необходимое для реорганизации! – KingCronus

1

Вы есть в основном два варианта для обеспечения соблюдения этого ограничения:

  1. Не запрашивать таблицы непосредственно, но с помощью представлений InstEd, какой фильтр удаленные строки на стороне базы данных. Это имеет недостаток, что ваше приложение не имеет возможности извлекать отмеченные записи (т. Е. Из интерфейса администратора).

  2. Не используйте созданные навигационные свойства L2S, удалив ассоциации в вашей L2Smodel. Этот метод имеет недостаток, что вы должны явно запрашивать связанный объект через свой репозиторий.

+0

Ян, спасибо за ответ ... ваш ответ был почти таким же, как у Джона, и он был опубликован в то же время, но это не позволит мне присудить обоим. – KingCronus

+0

Без проблем, добро пожаловать! – Jan

Смежные вопросы