2012-01-12 15 views
6

Así que aquí está mi situación:Entity Framework, suave-supresión y consultas

Estoy suave eliminando algunas filas de una tabla, usando una bandera IsDeleted, de manera que una puede mantener un seguimiento de mis datos archivados. Lo hago sobrescribiendo la declaración SaveChanges en mi ObjectContext.

La pregunta es: ¿cómo puedo seleccionar solo la (s) fila (s) que tienen IsDeleted == false, sin tener que especificar && !IsDeleted en cada pregunta?

¿Hay alguna manera de especificar esto en mi contexto directamente?

tkx!

+0

EF-Código primera o la cesión de primera? – StriplingWarrior

+0

En vez de marcar, usa una tabla. Para la tabla eliminada, PK puede ser la misma PK que la tabla principal, con PK a FK de la tabla eliminada en la tabla principal. Si tienes un registro en eliminado, se elimina, si no está activo. Entonces es solo una simple unión. El rendimiento de las consultas será mejor que usar un indicador de bits. –

+0

@JonRaynor: Las bases de datos no son mi especialidad, pero me parece que revisar la bandera de un bit tiene que ser mucho menos costoso que hacer una combinación, especialmente porque normalmente estarás más interesado en saber qué elementos * no * se borran (y por lo tanto no están presentes en la tabla eliminada). Si el indicador de bit está perjudicando el rendimiento de la consulta, preferiría un índice sobre la creación de una tabla completamente separada. – StriplingWarrior

Respuesta

7

Se podría definir una vista por encima de su tabla y consulta vista en lugar de que:

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

Y luego, en su modelo EDMX, leer los datos de la vista ActiveData lugar de la tabla base.

6

Si hace clic derecho en EntitySet en el visor de modelos y hace clic en "Table Mapping", hay un área donde puede "Agregar una condición". Esto debería hacer lo que estás pidiendo, aunque es mejor que utilices una Vista, según la sugerencia de marc_s.

+0

El mapeo condicional es la forma correcta de ir en EF. Usar la vista como @marc sugiere trabajos pero requerirá cambios adicionales. –

+0

¿Cómo haría mapeo condicional con código primero, sin un edmx físico? – danludwig

+0

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

1

Esta es una vieja pregunta ahora, pero para cualquier persona nueva que venga aquí. A partir de EF 6 realmente deberías estar usando interceptores para este tipo de consulta. Coloca una consulta dentro de la consulta SQL a medida que se ejecuta y filtra los registros basados ​​en la bandera.

Véase lo siguiente para más información:

Soft Deleting Entities using Interceptors