19

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

4

7 回答 7

19

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

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

于 2015-12-17T04:18:56.400 回答
10

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

[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(在查询字符串中)并尝试不同的组合。

于 2013-03-18T04:32:42.360 回答
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();  
    }
}
于 2017-04-13T15:11:47.980 回答
6

上面的答案可能已经过时了... DeleteObject 方法在当前版本的实体框架中似乎不存在。我不得不使用 Remove 方法。

var delobj = db.mytable.Where(p => p.ServiceLocation == serviceLocationID).SingleOrDefault();
db.myTable.Remove(delobj);
于 2016-10-26T14:45:37.893 回答
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();
    }

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

于 2013-03-19T02:50:58.727 回答
2

以下对我有用:

MyList.RemoveAll(x => x.MyField == 0);
于 2019-01-07T02:57:29.417 回答
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();
}
于 2013-05-30T12:19:11.290 回答