2013-03-18 87 views
10

我只是有一個非常簡單的情況,我需要的是使用Linq2Entities刪除記錄。我試圖做一些研究,但仍然無法找出正確的做法。正確的方法來刪除LINQ to Entities中的記錄

這裏是我的簡單的代碼:

[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 ==「哈羅德·哈維爾」以刪除上述方法,但是當我分配ÿ .EmployeeId == z.EmployeeId到上面的代碼,刪除不起作用。 (注意:EmployeeId是Employee表的主鍵)

+3

你的代碼有什麼問題?任何錯誤?如果是的話發佈。 – 2013-03-18 04:23:29

+0

我們可以編譯代碼,看起來沒問題。但是當我們將它與O​​bjectDataSource(ASP.NET WebForm)一起使用時,Delete按鈕不起作用。 – 2013-03-18 05:38:00

+0

嘗試'ctx.Employees.DeleteOnSubmit(x)'而不是'ctx.DeleteObject(x)' – MarcinJuraszek 2013-03-18 08:51:13

回答

3

我決定回答我自己的問題。

我刪除功能工作時,我做了以下內容:

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

我知道可能有比這更好的辦法,但它爲我工作的平均時間。

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(在查詢字符串處)並嘗試不同的組合。

+1

謝謝,DonNet夢想家。但仍然檢查空值並不能解決我們的問題。 – 2013-03-18 05:39:16

+0

我一直使用Delete函數作爲POST方法('[HttpPost]'),而不是get,這消除了保護querystring的需要。空檢查總是很好的做法,但它與OP的問題無關,也不是確保應用程序安全的最佳方式。 – Flater 2013-03-18 08:57:41

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

我認爲這是在我身邊DeleteObject不工作所以刪除

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

更好的選擇,我使用Remove

1

上面的答案可能已經過時了...... DeleteObject方法似乎不是ex在當前版本的ENtity Framework中。我不得不使用Remove方法。

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

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