在LINQ to Entities中删除记录的正确方法

Har*_*ier 15 c# linq linq-to-entities entity-framework

我只是有一个非常简单的情况,我需要的是使用Linq2Entities删除记录.我试图做一些研究,仍然无法找到正确的方法来做到这一点.

这是我的简单代码:

[DataObjectMethod(DataObjectMethodType.Delete)]
public void DeleteEmployee(Employee z)
{
    using (var ctx = new MyEntity())
    {
        var x = (from y in ctx.Employees
                 where  y.EmployeeId == z.EmployeeId
                 select y).FirstOrDefault();
         ctx.DeleteObject(x);
         ctx.SaveChanges();
    }
 }

[DataObjectMethod(DataObjectMethodType.Select)]
public List<Employee> GetAllEmployee()
{
    using (var ctx = new MyEntity())
    {
        var x = from y in ctx.Employees
                select y;
        return x.ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以删除一个特定的记录,例如我将y.EmployeeName =="Harold Javier"分配给上面的Delete方法,但是当我将y.EmployeeId == z.EmployeeId分配给上面的代码时,删除不起作用.(注意:EmployeeId是Employee表的主键)

小智 14

我认为这是删除的更好选择

using (var ctx = new MyEntity())
    {
        var x = (from y in ctx.Employees
             orderby  y.EmployeeId descending
             select y).FirstOrDefault();
        ctx.Employees.Remove(x);
        ctx.SaveChanges();
    }
Run Code Online (Sandbox Code Playgroud)

在我这边DeleteObject不工作所以我用Remove


Dot*_*mer 6

你首先需要在实际删除之前验证是否存在记录;

[DataObjectMethod(DataObjectMethodType.Delete)]

    public void DeleteEmployee(Employee z)
    {
        using (var ctx = new MyEntity())
        {
            var x = (from y in ctx.Employees
                     where  y.EmployeeId == z.EmployeeId
                     select y).FirstOrDefault();
             if(x!=null)
             {
             ctx.Employees.DeleteObject(x);
             ctx.SaveChanges();
             }
        }
     }
Run Code Online (Sandbox Code Playgroud)

在删除某些内容之前,请务必检查空值.因为用户可能会更改Id(在查询字符串处)并尝试不同的组合.


Jim*_*eri 6

@Harold,我知道这篇文章已经很老了,但我觉得解决您最初的问题和答案很重要。您的解决方案可能适用于您的情况,但存在一些问题。

首先,您的原始代码是根据传入的参数选择要删除的记录。您的解决方案是删除具有最大 EmployeeId 的记录。这可能是你想要的,但不太可能。第二个问题是需要两次数据库访问才能完成删除。第一个是获取要删除的实体,第二个是实际执行删除。

以下代码片段将消除读取的需要,并将删除员工“z”。这应该会产生所需的结果并且性能更好。

public void DeleteEmployeeId(Employee z)
{
    using (var ctx = new MyEntityContext())  
    {  
        var x = new Employee{ EmployeeId = z.EmployeeId };
        ctx.Entry(x).State = EntityState.Deleted;  
        ctx.SaveChanges();  
    }
}
Run Code Online (Sandbox Code Playgroud)


Sco*_*ter 5

上面的答案可能已过时...在当前版本的ENtity Framework中似乎不存在DeleteObject方法。我不得不使用Remove方法。

var delobj = db.mytable.Where(p => p.ServiceLocation == serviceLocationID).SingleOrDefault();
db.myTable.Remove(delobj);
Run Code Online (Sandbox Code Playgroud)


Har*_*ier 4

我决定回答我自己的问题。

当我执行以下操作时,我的删除功能起作用了:

using (var ctx = new MyEntity())
    {
        var x = (from y in ctx.Employees
             orderby  y.EmployeeId descending
             select y).FirstOrDefault();
        ctx.Employees.DeleteObject(x);
        ctx.SaveChanges();
    }
Run Code Online (Sandbox Code Playgroud)

我知道可能有比这更好的方法,但它同时对我有用。