Tôi có một bảng SQL Server trong Entity Framework được đặt tên employ
với một cột khóa duy nhất có tên ID
.
Làm cách nào để xóa một bản ghi khỏi bảng bằng Entity Framework?
Tôi có một bảng SQL Server trong Entity Framework được đặt tên employ
với một cột khóa duy nhất có tên ID
.
Làm cách nào để xóa một bản ghi khỏi bảng bằng Entity Framework?
Câu trả lời:
Không cần thiết phải truy vấn đối tượng trước, bạn có thể đính kèm nó vào ngữ cảnh theo id của nó. Như thế này:
var employer = new Employ { Id = 1 };
ctx.Employ.Attach(employer);
ctx.Employ.Remove(employer);
ctx.SaveChanges();
Ngoài ra, bạn có thể đặt trạng thái của mục nhập đính kèm thành bị xóa:
var employer = new Employ { Id = 1 };
ctx.Entry(employer).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(employer).State = EntityState.Deleted
Bạn có thể sử dụng SingleOrDefault
để có được một đối tượng phù hợp với tiêu chí của mình và sau đó chuyển đối tượng đó sang Remove
phương thức của bảng 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
là nguy hiểm. Hoặc bạn biết chỉ có một (nên sử dụng SingleOrDefault
), hoặc có nhiều hơn một, và nó nên được thực hiện trong một vòng lặp.
Employer employer = context.Employers.First(x => x.EmployerId == 1);
context.Customers.DeleteObject(employer);
context.SaveChanges();
First
là nguy hiểm. Hoặc bạn biết chỉ có một (nên sử dụng Single
), hoặc có nhiều hơn một, và nó nên được thực hiện trong một vòng lặp.
Tôi đang sử dụng khung thực thể với LINQ. Mã sau đây là hữu ích cho tôi;
1- Đối với nhiều hồ sơ
using (var dbContext = new Chat_ServerEntities())
{
var allRec= dbContext.myEntities;
dbContext.myEntities.RemoveRange(allRec);
dbContext.SaveChanges();
}
2- Đối với hồ sơ đơn
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
thay vì FirstOrDefault
?
Approuch chung hơn
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);
}
Với Entity Framework 6, bạn có thể sử dụng Remove
. Ngoài ra, đó là một chiến thuật tốt để sử dụng using
để đảm bảo rằng kết nối của bạn được đóng lại.
using (var context = new EmployDbContext())
{
Employ emp = context.Employ.Where(x => x.Id == id).Single<Employ>();
context.Employ.Remove(emp);
context.SaveChanges();
}
Chỉ muốn đóng góp ba phương pháp mà tôi đã trả lại.
Cách 1:
var record = ctx.Records.FirstOrDefault();
ctx.Records.Remove(record);
ctx.SaveChanges();
Cách 2:
var record = ctx.Records.FirstOfDefault();
ctx.Entry(record).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(record).State = EntityState.Detached;
Một trong những lý do tại sao tôi thích đi cùng Phương pháp 2 là vì trong trường hợp cài đặt EF hoặc EFCore QueryTrackingBehavior.NoTracking
, sẽ an toàn hơn khi thực hiện.
Sau đó, có Phương pháp 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;
Điều này sử dụng cách tiếp cận xóa mềm bằng cách thiết lập thuộc tính của bản ghi DeletedOn
và vẫn có thể giữ bản ghi để sử dụng trong tương lai, điều đó có thể xảy ra. Về cơ bản, đặt nó vào Thùng rác .
Ngoài ra, liên quan đến Phương pháp 3 , thay vì đặt toàn bộ hồ sơ thành sửa đổi:
entry.State = EntityState.Modified;
Bạn cũng chỉ cần đặt cột DeletedOn
như đã sửa đổi:
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);
}
}
Bạn nghĩ gì về điều này, đơn giản hay không, bạn cũng có thể thử điều này:
var productrow = cnn.Product.Find(id);
cnn.Product.Remove(productrow);
cnn.SaveChanges();
Sử dụng EntityFramework.Plus có thể là một tùy chọn:
dbContext.Employ.Where(e => e.Id == 1).Delete();
Thêm ví dụ có sẵn ở đây
bạn có thể làm nó đơn giản như thế này
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");
}
}
mô hình
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; }
}
xem từ đó bạn sẽ gọi nó
<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>
tôi hy vọng điều này sẽ dễ dàng cho bạn hiểu
Bạn có thể làm một cái gì đó như thế này trong sự kiện nhấp chuột hoặc celldoubleclick của lưới của bạn (nếu bạn đã sử dụng một)
if(dgEmp.CurrentRow.Index != -1)
{
employ.Id = (Int32)dgEmp.CurrentRow.Cells["Id"].Value;
//Some other stuff here
}
Sau đó làm một cái gì đó như thế này trong Nút Xóa của bạn:
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
}
Ngoài ra, bạn có thể sử dụng Truy vấn LINQ thay vì sử dụng Truy vấn LINQ To Thực thể:
var query = (from emp in db.Employee
where emp.Id == employ.Id
select emp).Single();
Employ.Id được sử dụng làm tham số lọc đã được truyền từ Sự kiện CellDoubleClick của DataGridView của bạn.
Đây là một cách an toàn:
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...
}
}
Tại đây, bạn có thể chồng tất cả các thay đổi bạn muốn, vì vậy bạn có thể thực hiện một loạt xóa trước SaveChanges và Cam kết, vì vậy chúng sẽ chỉ được áp dụng nếu tất cả đều thành công.