我在实体框架中有一个名为雇佣的SQL Server表,其中有一个名为ID的键列。

如何使用实体框架从表中删除单个记录?


当前回答

你可以在网格的点击或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();

雇佣。Id用作过滤参数,它已经从DataGridView的CellDoubleClick事件中传递。

其他回答

对于泛型DAO,这是可行的:

    public void Delete(T entity)
    {
        db.Entry(entity).State = EntityState.Deleted;
        db.SaveChanges();
    }

不需要先查询对象,可以通过它的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();

你可以在网格的点击或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();

雇佣。Id用作过滤参数,它已经从DataGridView的CellDoubleClick事件中传递。

我使用实体框架与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();
 }

只是想贡献一下我反复使用的三个方法。

方法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列设置为modified:

entry.Property(x => x.DeletedOn).IsModified = true;