Tengo una tabla de SQL Server en Entity Framework employcon una sola columna de clave llamada ID.
¿Cómo elimino un solo registro de la tabla con Entity Framework?
Tengo una tabla de SQL Server en Entity Framework employcon una sola columna de clave llamada ID.
¿Cómo elimino un solo registro de la tabla con Entity Framework?
Respuestas:
No es necesario consultar primero el objeto, puede adjuntarlo al contexto por su id. Me gusta esto:
var employer = new Employ { Id = 1 };
ctx.Employ.Attach(employer);
ctx.Employ.Remove(employer);
ctx.SaveChanges();
Alternativamente, puede establecer el estado de la entrada adjunta en eliminado:
var employer = new Employ { Id = 1 };
ctx.Entry(employer).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(employer).State = EntityState.Deleted
Puede usar SingleOrDefaultpara obtener un solo objeto que coincida con sus criterios, y luego pasarlo al Removemétodo de su tabla EF.
var itemToRemove = Context.Employ.SingleOrDefault(x => x.id == 1); //returns a single item.
if (itemToRemove != null) {
Context.Employ.Remove(itemToRemove);
Context.SaveChanges();
}
var stud = (from s1 in entities.Students
where s1.ID== student.ID
select s1).SingleOrDefault();
//Delete it from memory
entities.DeleteObject(stud);
//Save to database
entities.SaveChanges();
FirstOrDefaultes peligroso. O sabe que solo hay uno (así que use SingleOrDefault), o hay más de uno, y debe hacerse en un bucle.
Employer employer = context.Employers.First(x => x.EmployerId == 1);
context.Customers.DeleteObject(employer);
context.SaveChanges();
Firstes peligroso. O sabe que solo hay uno (así que use Single), o hay más de uno, y debe hacerse en un bucle.
Estoy usando el marco de la entidad con LINQ. El siguiente código fue útil para mí;
1- Para registros múltiples
using (var dbContext = new Chat_ServerEntities())
{
var allRec= dbContext.myEntities;
dbContext.myEntities.RemoveRange(allRec);
dbContext.SaveChanges();
}
2- Para registro único
using (var dbContext = new Chat_ServerEntities())
{
var singleRec = dbContext.ChatUserConnections.FirstOrDefault( x => x.ID ==1);// object your want to delete
dbContext.ChatUserConnections.Remove(singleRec);
dbContext.SaveChanges();
}
SingleOrDefaultlugar de FirstOrDefault?
Approuch más genérico
public virtual void Delete<T>(int id) where T : BaseEntity, new()
{
T instance = Activator.CreateInstance<T>();
instance.Id = id;
if (dbContext.Entry<T>(entity).State == EntityState.Detached)
{
dbContext.Set<T>().Attach(entity);
}
dbContext.Set<T>().Remove(entity);
}
Con Entity Framework 6, puede usar Remove. También es una buena táctica usingpara asegurarse de que su conexión esté cerrada.
using (var context = new EmployDbContext())
{
Employ emp = context.Employ.Where(x => x.Id == id).Single<Employ>();
context.Employ.Remove(emp);
context.SaveChanges();
}
Solo quería contribuir con los tres métodos con los que he rebotado.
Método 1:
var record = ctx.Records.FirstOrDefault();
ctx.Records.Remove(record);
ctx.SaveChanges();
Método 2:
var record = ctx.Records.FirstOfDefault();
ctx.Entry(record).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(record).State = EntityState.Detached;
Una de las razones por las que prefiero seguir con el Método 2 es porque en el caso de configurar EF o EFCore QueryTrackingBehavior.NoTracking, es más seguro hacerlo.
Luego está el Método 3:
var record = ctx.Records.FirstOrDefault();
var entry = ctx.Entry(record);
record.DeletedOn = DateTimeOffset.Now;
entry.State = EntityState.Modified;
ctx.SaveChanges();
entry.State = EntityState.Detached;
Esto utiliza un enfoque de eliminación suave al establecer la DeletedOnpropiedad del registro y aún así poder mantener el registro para uso futuro, sea lo que sea. Básicamente, ponerlo en la Papelera de reciclaje .
Además, con respecto al Método 3 , en lugar de configurar todo el registro para que se modifique:
entry.State = EntityState.Modified;
También simplemente establecería solo la columna DeletedOncomo modificada:
entry.Property(x => x.DeletedOn).IsModified = true;
[HttpPost]
public JsonResult DeleteCotnact(int id)
{
using (MycasedbEntities dbde = new MycasedbEntities())
{
Contact rowcontact = (from c in dbde.Contact
where c.Id == id
select c).FirstOrDefault();
dbde.Contact.Remove(rowcontact);
dbde.SaveChanges();
return Json(id);
}
}
¿Qué opinas de esto, simple o no? También puedes probar esto:
var productrow = cnn.Product.Find(id);
cnn.Product.Remove(productrow);
cnn.SaveChanges();
Usar EntityFramework.Plus podría ser una opción:
dbContext.Employ.Where(e => e.Id == 1).Delete();
Más ejemplos están disponibles aquí
puedes hacerlo simplemente así
public ActionResult Delete(int? id)
{
using (var db = new RegistrationEntities())
{
Models.RegisterTable Obj = new Models.RegisterTable();
Registration.DAL.RegisterDbTable personalDetail = db.RegisterDbTable.Find(id);
if (personalDetail == null)
{
return HttpNotFound();
}
else
{
Obj.UserID = personalDetail.UserID;
Obj.FirstName = personalDetail.FName;
Obj.LastName = personalDetail.LName;
Obj.City = personalDetail.City;
}
return View(Obj);
}
}
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int? id)
{
using (var db = new RegistrationEntities())
{
Registration.DAL.RegisterDbTable personalDetail = db.RegisterDbTable.Find(id);
db.RegisterDbTable.Remove(personalDetail);
db.SaveChanges();
return RedirectToAction("where u want it to redirect");
}
}
modelo
public class RegisterTable
{
public int UserID
{ get; set; }
public string FirstName
{ get; set; }
public string LastName
{ get; set; }
public string Password
{ get; set; }
public string City
{ get; set; }
}
vista desde la cual lo llamarás
<table class="table">
<tr>
<th>
FirstName
</th>
<th>
LastName
</th>
<th>
City
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td> @item.FirstName </td>
<td> @item.LastName </td>
<td> @item.City</td>
<td>
<a href="@Url.Action("Edit", "Registeration", new { id = item.UserID })">Edit</a> |
<a href="@Url.Action("Details", "Registeration", new { id = item.UserID })">Details</a> |
<a href="@Url.Action("Delete", "Registeration", new { id = item.UserID })">Delete</a>
</td>
</tr>
}
</table>
Espero que esto sea fácil de entender
Puede hacer algo como esto en su evento click o celldoubleclick de su cuadrícula (si utilizó uno)
if(dgEmp.CurrentRow.Index != -1)
{
employ.Id = (Int32)dgEmp.CurrentRow.Cells["Id"].Value;
//Some other stuff here
}
Luego haga algo como esto en su botón Eliminar:
using(Context context = new Context())
{
var entry = context.Entry(employ);
if(entry.State == EntityState.Detached)
{
//Attached it since the record is already being tracked
context.Employee.Attach(employ);
}
//Use Remove method to remove it virtually from the memory
context.Employee.Remove(employ);
//Finally, execute SaveChanges method to finalized the delete command
//to the actual table
context.SaveChanges();
//Some stuff here
}
Alternativamente, puede usar una consulta LINQ en lugar de usar la consulta LINQ To Entities:
var query = (from emp in db.Employee
where emp.Id == employ.Id
select emp).Single();
mploy.Id se utiliza como parámetro de filtrado que ya pasó del evento CellDoubleClick de su DataGridView.
Aquí hay una manera segura:
using (var transitron = ctx.Database.BeginTransaction())
{
try
{
var employer = new Employ { Id = 1 };
ctx.Entry(employer).State = EntityState.Deleted;
ctx.SaveChanges();
transitron.Commit();
}
catch (Exception ex)
{
transitron.Rollback();
//capture exception like: entity does not exist, Id property does not exist, etc...
}
}
Aquí puede agrupar todos los cambios que desee, para que pueda hacer una serie de borrados antes de SaveChanges y Commit, para que se apliquen solo si todos son exitosos.