Saya memiliki tabel SQL Server di Entity Framework bernama employ
dengan satu kolom kunci bernama ID
.
Bagaimana cara menghapus satu catatan dari tabel menggunakan Kerangka Entity?
Saya memiliki tabel SQL Server di Entity Framework bernama employ
dengan satu kolom kunci bernama ID
.
Bagaimana cara menghapus satu catatan dari tabel menggunakan Kerangka Entity?
Jawaban:
Itu tidak perlu untuk query objek terlebih dahulu, Anda dapat melampirkannya ke konteks dengan id-nya. Seperti ini:
var employer = new Employ { Id = 1 };
ctx.Employ.Attach(employer);
ctx.Employ.Remove(employer);
ctx.SaveChanges();
Atau, Anda dapat mengatur status entri terlampir untuk dihapus:
var employer = new Employ { Id = 1 };
ctx.Entry(employer).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(employer).State = EntityState.Deleted
Anda dapat menggunakan SingleOrDefault
untuk mendapatkan satu objek yang cocok dengan kriteria Anda, dan kemudian meneruskannya ke Remove
metode tabel EF Anda.
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
berbahaya. Entah Anda tahu hanya ada satu (jadi gunakan SingleOrDefault
), atau ada lebih dari satu, dan itu harus dilakukan dalam satu lingkaran.
Employer employer = context.Employers.First(x => x.EmployerId == 1);
context.Customers.DeleteObject(employer);
context.SaveChanges();
First
berbahaya. Entah Anda tahu hanya ada satu (jadi gunakan Single
), atau ada lebih dari satu, dan itu harus dilakukan dalam satu lingkaran.
Saya menggunakan kerangka kerja entitas dengan LINQ. Kode berikut sangat membantu saya;
1- Untuk banyak catatan
using (var dbContext = new Chat_ServerEntities())
{
var allRec= dbContext.myEntities;
dbContext.myEntities.RemoveRange(allRec);
dbContext.SaveChanges();
}
2- Untuk catatan tunggal
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
bukan FirstOrDefault
?
Persetujuan yang lebih umum
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);
}
Dengan Entity Framework 6, Anda bisa menggunakan Remove
. Juga merupakan taktik yang baik untuk digunakan using
untuk memastikan koneksi Anda ditutup.
using (var context = new EmployDbContext())
{
Employ emp = context.Employ.Where(x => x.Id == id).Single<Employ>();
context.Employ.Remove(emp);
context.SaveChanges();
}
Hanya ingin menyumbangkan tiga metode yang telah saya bolak-balik.
Metode 1:
var record = ctx.Records.FirstOrDefault();
ctx.Records.Remove(record);
ctx.SaveChanges();
Metode 2:
var record = ctx.Records.FirstOfDefault();
ctx.Entry(record).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(record).State = EntityState.Detached;
Salah satu alasan mengapa saya lebih suka menggunakan Metode 2 adalah karena dalam hal mengatur EF atau EFCore QueryTrackingBehavior.NoTracking
, itu lebih aman untuk dilakukan.
Lalu ada Metode 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;
Ini menggunakan pendekatan penghapusan lunak dengan menetapkan DeletedOn
properti catatan , dan masih dapat menyimpan catatan untuk digunakan di masa depan, apa pun itu. Pada dasarnya, menaruhnya di Recycle Bin .
Juga, sehubungan dengan Metode 3 , alih-alih mengatur seluruh catatan yang akan dimodifikasi:
entry.State = EntityState.Modified;
Anda juga hanya akan mengatur kolom yang DeletedOn
dimodifikasi:
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);
}
}
Apa pendapat Anda tentang ini, sederhana atau tidak, Anda juga dapat mencoba ini:
var productrow = cnn.Product.Find(id);
cnn.Product.Remove(productrow);
cnn.SaveChanges();
Menggunakan EntityFramework.Plus bisa menjadi pilihan:
dbContext.Employ.Where(e => e.Id == 1).Delete();
Lebih banyak contoh tersedia di sini
kamu dapat melakukannya hanya seperti ini
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");
}
}
model
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; }
}
lihat dari mana Anda akan menyebutnya
<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>
Saya harap ini akan mudah bagi Anda untuk mengerti
Anda dapat melakukan sesuatu seperti ini di klik atau sel acara klik kotak Anda (jika Anda menggunakannya)
if(dgEmp.CurrentRow.Index != -1)
{
employ.Id = (Int32)dgEmp.CurrentRow.Cells["Id"].Value;
//Some other stuff here
}
Kemudian lakukan sesuatu seperti ini di Tombol Hapus Anda:
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
}
Atau, Anda bisa menggunakan Kueri LINQ alih-alih menggunakan LINQ Ke Entitas Kueri:
var query = (from emp in db.Employee
where emp.Id == employ.Id
select emp).Single();
mempekerjakan.Id digunakan sebagai parameter pemfilteran yang sudah diteruskan dari SelDoubleClick Peristiwa DataGridView Anda.
Inilah cara yang aman:
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...
}
}
Di sini Anda dapat menumpuk semua perubahan yang Anda inginkan, sehingga Anda dapat melakukan serangkaian penghapusan sebelum SaveChanges dan Commit, sehingga mereka akan diterapkan hanya jika mereka semua berhasil.