2011-12-27 375 views
11

是否有內置的方式使用主鍵將Linq刪除到Entites。Linq to Entities刪除

目前M編輯解決辦法是創建一個名爲DeleteTable(表作爲表名)

,然後在C#LINQ到實體存儲過程只是我context.DeleteTable(ID)

是這個最好的辦法?還有什麼其他選擇?

回答

11

如果您不想去數據庫檢索所有對象的字段,則可以創建該類的新實例,將其附加到新的上下文,刪除該對象並保存更改。這可以讓EF生成適當的刪除命令。

using (var context = new MyContext()) 
{ 
    var myObject = new MyObject { ID = 3 }; 
    context.MyObjectSet.Attach(myObject); 
    context.MyObjectSet.DeleteObject(myObject); 
    context.SaveChanges(); 
} 

注意:這會引發您嘗試刪除不存在的對象的異常。如果你確定這個對象存在,那這是唯一合適的。

注2:此假定你已經設置了實體,以便生成的delete命令沒有引用任何其他領域比ID(即沒有時間戳性質,或任何類似的將被包括在查詢)

+0

建議這樣做是否真的有效?甜!這會很有用。 +1 – BZink 2011-12-27 22:22:51

+1

它的工作原理,但我應該補充說,它只適用於EF生成的刪除命令沒有引用除ID之外的其他字段。如果您有Timestamp字段,則EF會將其包含在生成的查詢中,但由於它不知道要使用的值,因此查詢將會出錯。 – hvd 2011-12-27 22:24:41

5

默認的方法是查詢實體,然後發出.DeleteObject(...)方法。

+1

內這會不會要求2趟DB? – michael 2011-12-28 01:37:22

+0

是的。如果您不想映射或調用顯式存儲過程,則只能使用有限的選項。 – 2011-12-28 11:56:52

+0

@michael'附加'不需要旅行? – 2015-05-18 10:19:11

1

使用執行命令,以您的需求關閉的背景下,如:

mycontext.ExecuteCommand("DELETE FROM MYTABLE"); 

mycontext.ExecuteCommand("TRUNCATE TABLE MYTABLE"); 

HTH

+0

是否有ExecuteCommand方法可用於鏈接到Entites?或者它只是鏈接到SQL? – michael 2011-12-27 23:55:08

+0

我的不好。請參閱EF的ExecuteStoreQuery。請參閱如何:直接對數據源執行命令(http://msdn.microsoft.com/en-us/library/ee358769.aspx)HTH – OmegaMan 2011-12-28 00:48:25

+0

謝謝,我從來不知道我可以直接從鏈接到實體。 – michael 2011-12-28 01:36:48

2

可以使用DbSet<T>.Remove(entity)(版本4.1,4.2)或EntitySet<T>.Remove(entity)(版本1.0,4.0)方法:

YourDbContext.Table.Remove(entityObject); 
+0

再次,我認爲你需要選擇實體,然後才能刪除它?因此2次旅行..我是ybe錯誤? – michael 2011-12-27 23:54:08

+0

是的,你必須查詢實體,或者你可以使用'Attach'方法,@ hvd – Jan 2011-12-28 08:38:29

2

我使用搜索項目來刪除,然後使用DeleteObject方法刪除它們(他們)。

Dim itemToDelete = (From u In db.SOME_TABLE Where u.ID = ID).FirstOrDefault 
db.SOME_TABLE.DeleteObject(itemToDelete) 
db.SaveChanges() 

使用這個try catch塊

+0

是不是在做2次到DB? (即select * from some_Table,其中id = Id)然後(從some_table中刪除foo,其中..)? – michael 2011-12-27 23:53:30

+0

是的,但是如果你不想做2次往返數據庫的最後一次使用SP,但是你可以將插入,更新和刪除命令映射到SP,如果你不映射任何一個,那麼你將得到一個UpdateException異常。 – Piyey 2011-12-28 15:07:24