2011-12-27 13 views
11

¿Hay un modo integrado para eliminar con Linq a Entites, utilizando la clave principal.Linq to Entities delete

Actualmente m solución es crear un procedimiento almacenado llamado DeleteTable (tabla es el nombre de la tabla)

y luego en C# LINQ a las entidades sólo que context.DeleteTable (ID)

Es este el ¿mejor manera? ¿Qué otras opciones hay?

Respuesta

11

Si no desea ir a la base de datos para recuperar todos los campos del objeto, puede crear una nueva instancia de la clase, adjuntarla a un nuevo contexto, eliminarla y guardar los cambios. Esto permite a EF generar el comando de eliminación apropiado.

using (var context = new MyContext()) 
{ 
    var myObject = new MyObject { ID = 3 }; 
    context.MyObjectSet.Attach(myObject); 
    context.MyObjectSet.DeleteObject(myObject); 
    context.SaveChanges(); 
} 

Nota: esto arrojará una excepción de que está tratando de eliminar un objeto que no existe. Eso solo es apropiado si estás seguro de que el objeto existe.

Nota 2: esto supone que haya configurado sus entidades para que la generada eliminar referencias de comandos no hay otros campos que el ID (es decir, no hay propiedades de marca de hora, o cualquier cosa similar que se incluirían en la consulta)

+0

¿Eso realmente funciona? ¡Dulce! Eso será útil. +1 – BZink

+1

Funciona, pero debería haber agregado que solo funciona si el comando de eliminación generado por EF no hace referencia a ningún otro campo que no sea el ID. Si tiene un campo Marca de tiempo, EF lo incluirá en la consulta generada, pero como no conoce el valor que debe usar, la consulta será incorrecta. – hvd

5

La forma predeterminada sería consultar la entidad y luego emitir el método .DeleteObject(...).

+1

¿no sería esto requerirá 2 viajes a la base de datos? – michael

+0

Sí. Si no desea asignar o llamar a procedimientos almacenados explícitos, tiene opciones limitadas. –

+0

@michael 'Attaching' no necesita un viaje? –

1

utilizar el comando Ejecutar para sus necesidades fuera del contexto como:

mycontext.ExecuteCommand("DELETE FROM MYTABLE"); 

o

mycontext.ExecuteCommand("TRUNCATE TABLE MYTABLE"); 

HTH

+0

¿Existe el método ExecuteCommand disponible para Link to Entites? o es solo un enlace a SQL? – michael

+0

Mi mal. vea ExecuteStoreQuery for EF. Vea Cómo: Ejecutar comandos directamente contra el origen de datos (http://msdn.microsoft.com/en-us/library/ee358769.aspx) HTH – OmegaMan

+0

Gracias, nunca supe que podía hacer esto directamente desde el enlace a las entidades. – michael

2

Puede utilizar el DbSet<T>.Remove(entity) (versión 4.1, 4.2) o EntitySet<T>.Remove(entity) (Versión 1.0, 4.0) métodos:

YourDbContext.Table.Remove(entityObject); 
+0

Una vez más, creo que debe seleccionar La entidad antes de poder eliminarla. por lo tanto, 2 viajes ... ¿Me equivoco? – michael

+0

Sí, debe consultar la entidad, o puede usar el enfoque 'Adjuntar', sugerido por @hvd – Jan

2

Utilizo para buscar los elementos para eliminarlos y luego eliminarlos utilizando el método DeleteObject.

Dim itemToDelete = (From u In db.SOME_TABLE Where u.ID = ID).FirstOrDefault 
db.SOME_TABLE.DeleteObject(itemToDelete) 
db.SaveChanges() 

uso de este dentro de un bloque intento de captura

+0

¿no es esto hacer 2 viajes a la base de datos? (es decir, seleccione * de alguna_Tabla donde id = Id) luego (elimine foo de alguna_tabla donde ...)? – michael

+0

Sí, pero si no desea hacer 2 viajes de ida y vuelta a la base de datos, la mayoría utiliza SP, pero asigna los comandos Insertar, Actualizar y Eliminar a SP, si no asigna alguno de ellos, obtendrá una excepción UpdateException. – Piyey

Cuestiones relacionadas