Ho una tabella di SQL Server in Entity Framework denominata employ
con una colonna chiave singola denominata ID
.
Come posso eliminare un singolo record dalla tabella usando Entity Framework?
Ho una tabella di SQL Server in Entity Framework denominata employ
con una colonna chiave singola denominata ID
.
Come posso eliminare un singolo record dalla tabella usando Entity Framework?
Risposte:
Non è necessario prima interrogare l'oggetto, è possibile collegarlo al contesto tramite il suo ID. Come questo:
var employer = new Employ { Id = 1 };
ctx.Employ.Attach(employer);
ctx.Employ.Remove(employer);
ctx.SaveChanges();
In alternativa, è possibile impostare lo stato della voce allegata su eliminato:
var employer = new Employ { Id = 1 };
ctx.Entry(employer).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(employer).State = EntityState.Deleted
È possibile utilizzare SingleOrDefault
per ottenere un singolo oggetto corrispondente ai propri criteri, quindi passarlo al Remove
metodo della tabella 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();
FirstOrDefault
è pericoloso. O sai che ce n'è solo uno (quindi usa SingleOrDefault
), o ce n'è più di uno e dovrebbe essere fatto in un ciclo.
Employer employer = context.Employers.First(x => x.EmployerId == 1);
context.Customers.DeleteObject(employer);
context.SaveChanges();
First
è pericoloso. O sai che ce n'è solo uno (quindi usa Single
), o ce n'è più di uno e dovrebbe essere fatto in un ciclo.
Sto usando il framework di entità con LINQ. Il seguente codice mi è stato utile;
1- Per più record
using (var dbContext = new Chat_ServerEntities())
{
var allRec= dbContext.myEntities;
dbContext.myEntities.RemoveRange(allRec);
dbContext.SaveChanges();
}
2- Per record singolo
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();
}
SingleOrDefault
invece di FirstOrDefault
?
Approvuch più generico
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, è possibile utilizzare Remove
. Inoltre è una buona tattica da usare using
per essere sicuri che la tua connessione sia chiusa.
using (var context = new EmployDbContext())
{
Employ emp = context.Employ.Where(x => x.Id == id).Single<Employ>();
context.Employ.Remove(emp);
context.SaveChanges();
}
Volevo solo contribuire con i tre metodi con cui sono rimbalzato avanti e indietro.
Metodo 1:
var record = ctx.Records.FirstOrDefault();
ctx.Records.Remove(record);
ctx.SaveChanges();
Metodo 2:
var record = ctx.Records.FirstOfDefault();
ctx.Entry(record).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(record).State = EntityState.Detached;
Uno dei motivi per cui preferisco seguire il metodo 2 è perché nel caso di impostare EF o EFCore su QueryTrackingBehavior.NoTracking
, è più sicuro farlo.
Quindi c'è il metodo 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;
Questo utilizza un approccio di eliminazione graduale impostando la DeletedOn
proprietà del record ed essendo ancora in grado di conservare il record per uso futuro, qualunque cosa possa essere. Fondamentalmente, mettendolo nel Cestino .
Inoltre, per quanto riguarda il Metodo 3 , invece di impostare l'intero record da modificare:
entry.State = EntityState.Modified;
Dovresti semplicemente impostare solo la colonna DeletedOn
come modificata:
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);
}
}
Cosa ne pensi di questo, semplice o no, potresti anche provare questo:
var productrow = cnn.Product.Find(id);
cnn.Product.Remove(productrow);
cnn.SaveChanges();
L'uso di EntityFramework.Plus potrebbe essere un'opzione:
dbContext.Employ.Where(e => e.Id == 1).Delete();
Altri esempi sono disponibili qui
puoi farlo semplicemente così
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");
}
}
modello
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 da cui lo chiamerai
<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>
spero che questo sia facile da capire
Puoi fare qualcosa del genere nel tuo evento click o celldoubleclick della tua griglia (se ne hai usato uno)
if(dgEmp.CurrentRow.Index != -1)
{
employ.Id = (Int32)dgEmp.CurrentRow.Cells["Id"].Value;
//Some other stuff here
}
Quindi fai qualcosa del genere nel tuo pulsante Elimina:
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
}
In alternativa, è possibile utilizzare una query LINQ anziché utilizzare la query LINQ To Entities:
var query = (from emp in db.Employee
where emp.Id == employ.Id
select emp).Single();
impiegato.Id viene utilizzato come parametro di filtro che è già stato passato dall'evento CellDoubleClick di DataGridView.
Ecco un modo sicuro:
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...
}
}
Qui puoi accumulare tutte le modifiche che desideri, quindi puoi fare una serie di eliminazioni prima di SaveChanges e Commit, in modo che vengano applicate solo se tutte hanno esito positivo.