ผมมีตาราง SQL Server ใน Entity Framework ชื่อมีคอลัมน์คีย์เดียวชื่อemploy
ID
ฉันจะลบระเบียนเดียวจากตารางโดยใช้ Entity Framework ได้อย่างไร
ผมมีตาราง SQL Server ใน Entity Framework ชื่อมีคอลัมน์คีย์เดียวชื่อemploy
ID
ฉันจะลบระเบียนเดียวจากตารางโดยใช้ Entity Framework ได้อย่างไร
คำตอบ:
ไม่จำเป็นต้องค้นหาวัตถุก่อนคุณสามารถแนบกับบริบทด้วยรหัส แบบนี้:
var employer = new Employ { Id = 1 };
ctx.Employ.Attach(employer);
ctx.Employ.Remove(employer);
ctx.SaveChanges();
หรือคุณสามารถตั้งค่าสถานะของรายการที่แนบเป็นลบ:
var employer = new Employ { Id = 1 };
ctx.Entry(employer).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(employer).State = EntityState.Deleted
คุณสามารถใช้SingleOrDefault
เพื่อรับวัตถุชิ้นเดียวที่ตรงกับเกณฑ์ของคุณแล้วส่งต่อไปยังRemove
วิธีการของตาราง 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
อันตราย. อย่างใดอย่างหนึ่งคุณรู้ว่ามีเพียงคนเดียว (เพื่อใช้SingleOrDefault
) หรือมีมากกว่าหนึ่งและมันควรจะทำในวง
Employer employer = context.Employers.First(x => x.EmployerId == 1);
context.Customers.DeleteObject(employer);
context.SaveChanges();
First
อันตราย. อย่างใดอย่างหนึ่งคุณรู้ว่ามีเพียงคนเดียว (เพื่อใช้Single
) หรือมีมากกว่าหนึ่งและมันควรจะทำในวง
ฉันใช้กรอบงานเอนทิตีกับ LINQ รหัสต่อไปนี้มีประโยชน์สำหรับฉัน;
1- สำหรับหลายระเบียน
using (var dbContext = new Chat_ServerEntities())
{
var allRec= dbContext.myEntities;
dbContext.myEntities.RemoveRange(allRec);
dbContext.SaveChanges();
}
2- สำหรับบันทึกเดียว
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
แทนFirstOrDefault
?
approuch ทั่วไปเพิ่มเติม
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);
}
ด้วย Entity Framework 6 Remove
คุณสามารถใช้ นอกจากนี้ยังเป็นกลยุทธ์ที่ดีที่จะใช้using
เพื่อให้แน่ใจว่าการเชื่อมต่อของคุณถูกปิด
using (var context = new EmployDbContext())
{
Employ emp = context.Employ.Where(x => x.Id == id).Single<Employ>();
context.Employ.Remove(emp);
context.SaveChanges();
}
แค่อยากมีส่วนร่วมในสามวิธีที่ฉันได้ตีกลับไปมาด้วย
วิธีที่ 1:
var record = ctx.Records.FirstOrDefault();
ctx.Records.Remove(record);
ctx.SaveChanges();
วิธีที่ 2:
var record = ctx.Records.FirstOfDefault();
ctx.Entry(record).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(record).State = EntityState.Detached;
หนึ่งในเหตุผลที่ฉันชอบไปกับวิธีที่ 2คือในกรณีที่ตั้งค่า EF หรือ EFCore QueryTrackingBehavior.NoTracking
เป็นวิธีที่ปลอดภัยกว่า
แล้วมีวิธีที่ 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;
วิธีนี้ใช้วิธีการลบแบบนุ่มนวลโดยการตั้งค่าDeletedOn
คุณสมบัติของเรกคอร์ดและยังคงสามารถเก็บบันทึกสำหรับใช้ในอนาคตสิ่งที่เคยเป็น โดยทั่วไปการวางไว้ใน Recycle Bin
นอกจากนี้เกี่ยวกับวิธีที่ 3แทนการตั้งค่าระเบียนทั้งหมดให้ถูกแก้ไข:
entry.State = EntityState.Modified;
นอกจากนี้คุณยังสามารถตั้งค่าเฉพาะคอลัมน์DeletedOn
ที่ถูกแก้ไข:
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);
}
}
คุณคิดอย่างไรกับเรื่องนี้ง่าย ๆ หรือไม่คุณสามารถลองสิ่งนี้ได้:
var productrow = cnn.Product.Find(id);
cnn.Product.Remove(productrow);
cnn.SaveChanges();
สำหรับ DAO ทั่วไปผลงานของฉัน finnaly นี้:
public void Detele(T entity)
{
db.Entry(entity).State = EntityState.Deleted;
db.SaveChanges();
}
ใช้EntityFramework.Plusอาจเป็นตัวเลือก:
dbContext.Employ.Where(e => e.Id == 1).Delete();
มีตัวอย่างเพิ่มเติมที่นี่
คุณสามารถทำมันได้อย่างนี้
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");
}
}
แบบ
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; }
}
ดูจากสิ่งที่คุณจะเรียกมันว่า
<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>
ฉันหวังว่ามันจะง่ายสำหรับคุณที่จะเข้าใจ
คุณสามารถทำสิ่งนี้ในการคลิกหรือเหตุการณ์ celldoubleclick ของตารางของคุณ (ถ้าคุณใช้)
if(dgEmp.CurrentRow.Index != -1)
{
employ.Id = (Int32)dgEmp.CurrentRow.Cells["Id"].Value;
//Some other stuff here
}
จากนั้นทำสิ่งนี้ในปุ่มลบของคุณ:
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
}
อีกวิธีหนึ่งคุณสามารถใช้ LINQ Query แทนการใช้ LINQ กับ Entities Query:
var query = (from emp in db.Employee
where emp.Id == employ.Id
select emp).Single();
ลูกจ้างใช้เป็นพารามิเตอร์การกรองซึ่งถูกส่งผ่านจากเหตุการณ์ CellDoubleClick ของ DataGridView ของคุณแล้ว
นี่เป็นวิธีที่ปลอดภัย:
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...
}
}
ที่นี่คุณสามารถรวมการเปลี่ยนแปลงทั้งหมดที่คุณต้องการเพื่อให้คุณสามารถทำการลบชุดก่อน SaveChanges and Commit ดังนั้นการเปลี่ยนแปลงเหล่านั้นจะถูกนำไปใช้เฉพาะเมื่อประสบความสำเร็จทั้งหมด
วิธีที่ดีที่สุดคือตรวจสอบแล้วลบ
if (ctx.Employ.Any(r=>r.Id == entity.Id))
{
Employ rec = new Employ() { Id = entity.Id };
ctx.Entry(rec).State = EntityState.Deleted;
ctx.SaveChanges();
}