2012-01-12 10 views
6

Więc oto moja sytuacja:Entity Framework, soft-kasowanie i zapytań

jestem miękki usuwając kilka wierszy w tabeli, za pomocą IsDeleted flagę, tak, że można zachować ślad moich danych archiwalnych. Robię to, zastępując oświadczenie SaveChanges w moim ObjectContext.

Pytanie brzmi: jak mogę wybrać tylko wiersz (y), które mają IsDeleted == false, bez konieczności określenia && !IsDeleted w każdym zapytaniu?

Czy istnieje sposób, aby określić to bezpośrednio w moim kontekście?

tkx!

+0

EF Kod pierwszego lub modela w pierwszej kolejności? – StriplingWarrior

+0

Zamiast flagi użyj tabeli. Dla usuniętego stołu PK może być taki sam PK jak stół główny, z PK usuniętą tabelą FK do tabeli głównej. Jeśli masz rekord w usunięciu, to jego usunięty, jeśli nie jest aktywny. Wtedy jest to po prostu proste dołączenie. Wydajność kwerendy będzie lepsza niż przy użyciu flagi bitowej. –

+0

@JonRaynor: Bazy danych nie są moją specjalnością, ale wydaje mi się, że sprawdzenie flagi bitowej musi być dużo tańsze niż zrobienie połączenia, zwłaszcza, że ​​zazwyczaj będziesz bardziej zainteresowany wiedzą, które elementy * nie są * usunięte (i dlatego nie są obecne w usuniętej tabeli). Jeśli flaga bitowa wywiera negatywny wpływ na wydajność zapytań, wolałbym indeks nad tworzeniem całkowicie oddzielnej tabeli. – StriplingWarrior

Odpowiedz

7

Można zdefiniować widok tabeli i kwerendy ten pogląd zamiast:

CREATE VIEW dbo.ActiveData 
AS 
    SELECT (list of columns) 
    FROM dbo.YourTable 
    WHERE IsDeleted = 0 

a następnie w modelu EDMX, odczytywanie danych z ActiveData widzenia zamiast tabeli bazowej.

6

Po kliknięciu prawym przyciskiem myszy EntitySet w przeglądarce modelu i kliknięciu "Mapowanie tabel", istnieje obszar, w którym można "Dodaj warunek". Powinno to zrobić to, o co prosisz, chociaż lepiej być może, używając widoku, zgodnie z sugestią marc_s.

+0

Mapowanie warunkowe to poprawny sposób na przejście w EF. Korzystanie z widoku jako @marc sugeruje prace, ale będzie wymagało dodatkowych zmian. –

+0

Jak wykonać mapowanie warunkowe za pomocą kodu, bez fizycznego edmx? – danludwig

+0

@olivehour: http://stackoverflow.com/questions/8161689/entity-framework-conditional-mapping-z -code-first – StriplingWarrior

1

To jest stare pytanie, ale dla każdego, kto tu przyjdzie. Od wersji EF 6 naprawdę powinieneś używać przechwytujących dla tego typu zapytania. Umieszcza zapytanie wewnątrz kwerendy SQL podczas działania i filtruje rekordy na podstawie flagi.

Zobacz następujące po więcej informacji:

Soft Deleting Entities using Interceptors