En LINQ a SQL, que podía hacer:Entity Framework Eliminar todo en enviar
context.User_Roles.DeleteAllOnSubmit(context.User_Roles.Where(ur => ur.UserId == user.UserId));
¿Cuál es el equivalente a este marco para la entidad?
En LINQ a SQL, que podía hacer:Entity Framework Eliminar todo en enviar
context.User_Roles.DeleteAllOnSubmit(context.User_Roles.Where(ur => ur.UserId == user.UserId));
¿Cuál es el equivalente a este marco para la entidad?
@Femaref tiene la idea correcta, pero para un verdadero análogo al L2E DeleteAllOnSubmit
, querrá que su método de extensión haga una copia de las entidades que se eliminan antes de enumerar para no obtener "colección modificada" al enumerar "excepciones".
public static void DeleteAllObjects<TEntity>(this ObjectSet<TEntity> set, IEnumerable<TEntity> data) where TEntity : class {
foreach(var entity in data.ToList()) //data.ToList() makes a copy of data for safe enumeration
set.DeleteObject(entity);
}
Este fue mi problema con la respuesta aceptada. ¿Hay una forma más eficiente que hacer todo el conjunto en la memoria? – Eric
@Eric - no está listo, necesitaría recurrir a una solución personalizada, tal vez usando SQL en línea de alguna manera, pero no he intentado algo así –
O simplemente itere a través de los datos usando: 'para (int i = data.Count() - 1; i> = 0; i--) set.DeleteObject (data.ElementAt (i)); ' – Jimbo
foreach(var entity in context.User_Roles.Where(ur => ur.UserId == user.UserId))
{
context.User_Roles.DeleteObject(entity);
}
context.SaveChanges();
Por supuesto, puede escribir un método de extensión, que lo encapsularía.
esto sería algo como esto:
public static void DeleteObjects<TEntity> (this ObjectSet<TEntity> set, IEnumerable<TEntity> data) where TEntity : class
{
foreach(var entity in data)
set.DeleteObject(entity);
}
Llamado como:
context.User_Roles.DeleteObjects(context.User_Roles.Where(ur => ur.UserId == user.UserId))
context.SaveChanges();
+1: Estaba escribiendo exactamente este código. –
Puede encontrarse con este problema utilizando este método, esto debería ayudar: http://stackoverflow.com/a/3742340/183174 – LostNomad311
@ nomad311 ¿cuál es exactamente el problema que menciona? – surfen
foreach(var entity in context.User_Roles.Where(ur => ur.UserId == user.UserId))
{
context.User_Roles.DeleteObject(entity);
}
context.SaveChanges();
por supuesto, esta solución puede funcionar. Pero, es la solución más ineficiente. Esta solución generará un comando SQL de eliminación para cada registro (entidad). Imagine que desea eliminar todos los datos antes del año 2000. hay más de 1,000,000 de registros en la base de datos. Si elimina estos objetos de esta manera, se enviarán más de 1,000,000 comandos SQL al servidor, es un gran desperdicio innecesario. Lo
La respuesta no es clara. ¿Cuál sería un enfoque alternativo, más eficiente? – surfen
No leí su código cuidadosamente. pero, ¿por qué dices "eliminar TODO al enviar"? ¿Qué quieres decir con "TODO" aquí?
si desea eliminar todos los datos en una tabla de más de 2000 filas o incluso más, debe usar la declaración de eliminación en lugar de las respuestas dadas anteriormente. para la consideración de la eficiencia. –
Jerry
Es poco probable que alguien tenga tantos usuarios con el mismo UserId (debería ser una clave principal y solo habría un usuario con este UserId).Sin embargo, estoy de acuerdo en que para un gran número de entidades existen soluciones más rápidas, como ** ExecuteStoreCommand ** http://stackoverflow.com/questions/869209/bulk-deleting-in-linq-to-entities – surfen
No hay equivalente en RemoveAll Marco de la entidad, por lo que puede cargar en la memoria entidades y les quite uno a uno utilizando el método DeleteObject.
Puede usar Linq: context.MyEntitie.RemoveAll (context.MyEntitie);
uso EntityFramework.Extensions
1) En primer lugar instalar EntityFramework.Extensions utilizando NuGet
2) Aquí está el código similar al DeleteAllOnSubmit de Linq2Sql():
using EntityFramework.Extensions;
....
public void DeleteAllUsers(User_Role user){
context.User_Roles.Delete(ur => ur.UserId == user.UserId);
context.SaveChanges();
}
...
si pasa un argumento como ur.UserID == user.UserId as bool, ¿por qué no acaba de pasar un 'verdadero' valor ;-) Tanto más limpia, de todos modos, que será siempre un antipatrón. – mikus
duplicado de http://stackoverflow.com/ preguntas/869209/bulk-deleting-in-linq-to-entities? lq = 1 – surfen