我在实体框架中有一个名为employ
的SQL Server表,其中一个键列名为ID
。
如何使用Entity Framework从表中删除单个记录?
答案 0 :(得分:325)
没有必要先查询对象,您可以通过其id将其附加到上下文。 像这样:
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();
答案 1 :(得分:73)
您可以使用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();
}
答案 2 :(得分:13)
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();
答案 3 :(得分:8)
Employer employer = context.Employers.First(x => x.EmployerId == 1);
context.Customers.DeleteObject(employer);
context.SaveChanges();
答案 4 :(得分:5)
我正在使用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();
}
答案 5 :(得分:1)
更通用的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);
}
答案 6 :(得分:1)
u可以像这样简单地完成
Last-Modified
模型
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; }
}
我希望这对您来说很容易理解
答案 7 :(得分:1)
在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();
}
答案 8 :(得分:1)
只想贡献我来回弹跳的三种方法。
方法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
属性来利用软删除方法,并且仍然可以保留该记录以备将来使用。基本上,将其放入回收站。
关于方法3 ,而不是将整个记录设置为要修改:
entry.State = EntityState.Modified;
您还可以仅将列DeletedOn
设置为已修改:
entry.Property(x => x.DeletedOn).IsModified = true;
答案 9 :(得分:0)
[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();
答案 10 :(得分:0)
对于通用DAO,我的工作完全是这样的:
public void Detele(T entity)
{
db.Entry(entity).State = EntityState.Deleted;
db.SaveChanges();
}
答案 11 :(得分:0)
答案 12 :(得分:0)
您可以在网格的click或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查询而不是LINQ到实体查询:
var query = (from emp in db.Employee
where emp.Id == employ.Id
select emp).Single();
employ.Id 用作已从DataGridView的CellDoubleClick事件传递的过滤参数。
答案 13 :(得分:0)
这是一种安全的方法:
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和Commit之前进行一系列删除,因此只有在所有更改成功后才应用它们。
答案 14 :(得分:0)
最好的方法是先检查然后删除
if (ctx.Employ.Any(r=>r.Id == entity.Id))
{
Employ rec = new Employ() { Id = entity.Id };
ctx.Entry(rec).State = EntityState.Deleted;
ctx.SaveChanges();
}