[英]Delete a single record from Entity Framework?
I have a SQL Server table in Entity Framework named employ
with a single key column named ID
.我在实体框架中有一个 SQL Server 表,名为employ
有一个名为ID
键列。
How do I delete a single record from the table using Entity Framework?如何使用实体框架从表中删除单个记录?
It's not necessary to query the object first, you can attach it to the context by its id.不必先查询对象,您可以通过其 id 将其附加到上下文。 Like this:像这样:
var employer = new Employ { Id = 1 };
ctx.Employ.Attach(employer);
ctx.Employ.Remove(employer);
ctx.SaveChanges();
Alternatively, you can set the attached entry's state to deleted :或者,您可以将附加条目的状态设置为已删除:
var employer = new Employ { Id = 1 };
ctx.Entry(employer).State = EntityState.Deleted;
ctx.SaveChanges();
You can use SingleOrDefault
to get a single object matching your criteria, and then pass that to the Remove
method of your EF table.您可以使用SingleOrDefault
获取与您的条件匹配的单个对象,然后将其传递给 EF 表的Remove
方法。
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();
Employer employer = context.Employers.First(x => x.EmployerId == 1);
context.Customers.DeleteObject(employer);
context.SaveChanges();
I am using entity framework with LINQ.我在 LINQ 中使用实体框架。 Following code was helpful for me;以下代码对我有帮助;
1- For multiple records 1- 对于多条记录
using (var dbContext = new Chat_ServerEntities())
{
var allRec= dbContext.myEntities;
dbContext.myEntities.RemoveRange(allRec);
dbContext.SaveChanges();
}
2- For Single record 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();
}
More generic 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);
}
With Entity Framework 6, you can use Remove
.使用实体框架 6,您可以使用Remove
。 Also it 'sa good tactic to use using
for being sure that your connection is closed.此外,使用它using
确保您的连接已关闭也是一种很好的策略。
using (var context = new EmployDbContext())
{
Employ emp = context.Employ.Where(x => x.Id == id).Single<Employ>();
context.Employ.Remove(emp);
context.SaveChanges();
}
Just wanted to contribute the three methods I've bounced back and forth with.只是想贡献我来回反弹的三种方法。
Method 1:方法一:
var record = ctx.Records.FirstOrDefault();
ctx.Records.Remove(record);
ctx.SaveChanges();
Method 2:方法二:
var record = ctx.Records.FirstOfDefault();
ctx.Entry(record).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(record).State = EntityState.Detached;
One of the reasons why I prefer to go with Method 2 is because in the case of setting EF or EFCore to QueryTrackingBehavior.NoTracking
, it's safer to do.我更喜欢使用方法 2的原因之一是,在将 EF 或 EFCore 设置为QueryTrackingBehavior.NoTracking
的情况下,这样做更安全。
Then there's Method 3:然后是方法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;
This utilizes a soft delete approach by setting the record's DeletedOn
property, and still being able to keep the record for future use, what ever that may be.这通过设置记录的DeletedOn
属性来使用软删除方法,并且仍然能够保留记录以备将来使用,无论是什么。 Basically, putting it in the Recycle Bin .基本上,将其放入回收站。
Also, in regards to Method 3 , instead of setting the entire record to being modified:此外,关于方法 3 ,而不是将整个记录设置为被修改:
entry.State = EntityState.Modified;
You would also simply set only the column DeletedOn
as 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);
}
}
What do you think of this, simple or not, you could also try this:你怎么看这个,简单与否,你也可以试试这个:
var productrow = cnn.Product.Find(id);
cnn.Product.Remove(productrow);
cnn.SaveChanges();
For a generic DAO this worked:对于通用 DAO,这有效:
public void Delete(T entity)
{
db.Entry(entity).State = EntityState.Deleted;
db.SaveChanges();
}
Using EntityFramework.Plus could be an option:使用EntityFramework.Plus可能是一种选择:
dbContext.Employ.Where(e => e.Id == 1).Delete();
u can do it simply like this你可以像这样简单地做到这一点
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; }
}
view from which u will call it你会从中调用它的视图
<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>
i hope this will be easy for u to understand我希望这对你来说很容易理解
You can do something like this in your click or celldoubleclick event of your grid(if you used one)你可以在你的网格的 click 或 celldoubleclick 事件中做这样的事情(如果你使用过)
if(dgEmp.CurrentRow.Index != -1)
{
employ.Id = (Int32)dgEmp.CurrentRow.Cells["Id"].Value;
//Some other stuff here
}
Then do something like this in your Delete Button:然后在您的删除按钮中执行以下操作:
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
}
Alternatively, you can use a LINQ Query instead of using LINQ To Entities Query:或者,您可以使用 LINQ 查询而不是使用 LINQ To Entities 查询:
var query = (from emp in db.Employee
where emp.Id == employ.Id
select emp).Single();
employ.Id is used as filtering parameter which was already passed from the CellDoubleClick Event of your DataGridView. use.Id用作过滤参数,该参数已从 DataGridView 的 CellDoubleClick 事件传递。
Here's a safe way:这是一个安全的方法:
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...
}
}
Here you can pile up all the changes you want, so you can do a series of deletion before the SaveChanges and Commit, so they will be applied only if they are all successful.在这里你可以把你想要的所有更改都堆起来,这样你就可以在SaveChanges和Commit之前做一系列的删除,这样只有全部成功才会应用。
The best way is to check and then delete最好的方法是检查然后删除
if (ctx.Employ.Any(r=>r.Id == entity.Id))
{
Employ rec = new Employ() { Id = entity.Id };
ctx.Entry(rec).State = EntityState.Deleted;
ctx.SaveChanges();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.