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

时间:2013-03-18 04:18:53

标签: c# linq entity-framework linq-to-entities

我只是有一个非常简单的情况,我需要的是使用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();
    }
}

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

7 个答案:

答案 0 :(得分:12)

我认为这是删除

的更好选择
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();
    }

在我身边DeleteObject无效,所以我使用Remove

答案 1 :(得分:5)

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

[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();
             }
        }
     }

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

答案 2 :(得分: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();
    }

我知道可能有比这更好的方法,但它适用于我平均时间。

答案 3 :(得分:4)

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

var delobj = db.mytable.Where(p => p.ServiceLocation == serviceLocationID).SingleOrDefault();
db.myTable.Remove(delobj);

答案 4 :(得分:2)

@Harold,我知道这篇文章很老了,但我认为解决你原来的问题和答案很重要。您的解决方案可能适用于您的情况,但存在一些问题。

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

以下代码段将消除对读取的需要,并将删除员工&#34; z&#34;。这应该会产生预期的结果并且表现更好。

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();  
    }
}

答案 5 :(得分:1)

这可能是因为每个请求的上下文不同(var ctx = new MyEntity())。尝试使用此

public static class ObjectContextPerHttpRequest
{
    public static TestCasesModelContainer Context
    {
        get
        {
            string objectContextKey = HttpContext.Current.GetHashCode().ToString("ObjectContextPerHttpRequest");

            if (!HttpContext.Current.Items.Contains(objectContextKey))
            {
                HttpContext.Current.Items.Add(objectContextKey, new TestCasesModelContainer());
            }

            return HttpContext.Current.Items[objectContextKey] as TestCasesModelContainer;
        }
    }
}

删除就像

public static void Delete(Testcase tc)
{
    var db = ObjectContextPerHttpRequest.Context;

    db.DeleteObject((from p in db.TestcaseSet
                     where p.Id == tc.Id
                     select p).Single());
    db.SaveChanges();
}

答案 6 :(得分:1)

以下对我有用:

MyList.RemoveAll(x => x.MyField == 0);
相关问题