2011-01-24 50 views
4

確認!我是新來的實體框架,並試圖找到最簡單的方法來刪除一個項目。最簡單的方法來刪除對象與實體框架4

我有設置從數據庫TagCategory對象的數據源列表框。這工作正常。現在我想刪除選定的項目。所以我做這樣的事情:

TagCategory category = (TagCategory)lstCategories.SelectedItem; 
using (MyEntities context = new MyEntities()) 
{ 
    context.AttachTo("TagCategories", category); 
    context.DeleteObject(category); 
    context.SaveChanges(); 
} 

這似乎挺直的,但它不起作用。沒有東西被刪除,沒有錯誤信息,什麼都沒有

因此,我認爲我可以,而不是做這樣的事情:

using (MyEntities context = new MyEntities()) 
{ 
    string cmd = String.Format("DELETE FROM TagCategory WHERE [email protected]", 
     category.TagCatID)); 
    context.ExecuteStoreCommand(qry); 
} 

,似乎工作。那麼,我只是繼續做什麼,或者實體框架4實際上能夠做到這一點?

編輯:沒關係。實際上,我遇到了另一個阻止代碼執行的問題。我發佈的這兩個片段似乎都可以正常工作。我很抱歉。

+1

的方式,儘量不要使用`AttachTo`上下文。使用`ObjectSet .Attach`。例如`context.TagCategories.Attach(category)`。同樣,`context.Categories.Delete(category)`而不是`context.DeleteObject(category)`。 – RPM1984 2011-01-24 23:23:49

+0

@ RPM1984:我曾想過,如果兩種語法都做同樣的事情。你能說爲什麼Attach()實體更好嗎? – 2011-01-24 23:26:49

+0

是不是很明顯?一個是強類型的,一個是魔術字符串。如果你重構你的模型,你會得到運行時錯誤。用`Attach`你會得到一個編譯錯誤。任何時候,如果你在應用程序中的任何地方放置了魔法字符串,請問自己爲什麼,看看是否可以避免。 – RPM1984 2011-01-25 00:19:51

回答

6

您可以使用存根實體,像這樣:

using (var context = new MyEntities()) 
{ 
    var tagCategory = new TagCategory 
    { 
     PostId = category.TagCatID 
    }; 
    context.TagCategories.Attach(tagCategory); 
    context.DeleteObject(tagCategory); 
    context.SaveChanges(); 
} 
2

我不確定您可以使用AttachTo()這個。取決於你如何填充列表框。

什麼應該工作:

var Key = context.CreateEntityKey("TagCategory", category); 
    Object original; 
    if (context.TryGetObjectByKey(Key, out original)) 
    { 
     context.DeleteObject(original); 
     context.SaveChanges(); 
    } 
0
// using the Find method of DBContext to retrieve the record you wish to delete 
// works for me 
// below code taken from a working WPF application using sdf database 

if (this.TransactionsDataGrid.SelectedIndex > -1) 
{ 
    Transaction transaction = this.TransactionsDataGrid.SelectedItem as Transaction; 
    if (transaction != null) 
    { 
     using (BilliEntities context = new BilliEntities()) 
     { 
      try 
      { 
       Transaction trans = context.Transactions.Find(transaction.TransactionId); 
       if (trans != null) 
       { 
        // observable collection for datagrid 
        this.Transactions.Remove(transaction); 
        context.Transactions.Remove(trans); 
        context.SaveChanges(); 
       } 
      } 
      catch (Exception ex) 
      { 
       // for debugging 
      } 
     } 
    } 
}