2011-12-27 17 views
11

Есть ли встроенный способ удаления с Linq to Entites с использованием Первичного ключа.Linq to Entities delete

В настоящее время м Обходной создать хранимую процедуру под названием DeleteTable (таблица является имя таблицы)

, а затем в C# LINQ To Entities Я просто 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: это предполагает, что вы настроили свои объекты таким образом, чтобы не сгенерирована Удалить ссылки команду никаких других полей, чем идентификатор (имеется в виду не свойства Timestamp, или что-нибудь подобное, которые будут включены в запрос)

+0

Действительно ли это работает? Милая! Это будет полезно. +1 – BZink

+1

Он работает, но я должен был добавить, что он работает только в том случае, если команда удаления сгенерированного EF ссылается на другие поля, кроме ID. Если у вас есть поле Timestamp, EF будет включать это в сгенерированный запрос, но поскольку он не знает значения для использования, запрос будет неправильным. – hvd

5

По умолчанию используется запрос запроса объекта, а затем выдача метода .DeleteObject(...).

+1

бы это не требуется 2 поездки в БД? – michael

+0

Да. Если вы не хотите отображать или вызывать явные хранимые процедуры, у вас есть ограниченные возможности. –

+0

@michael 'Attaching' не нуждается в поездке? –

1

Используйте команду выполнить для ваших нужд от контекста, например:

mycontext.ExecuteCommand("DELETE FROM MYTABLE"); 

или

mycontext.ExecuteCommand("TRUNCATE TABLE MYTABLE"); 

HTH

+0

Есть ли способ ExecuteCommand для связи с Entites? или это только ссылка на SQL? – michael

+0

Мой плохой. см. ExecuteStoreQuery для EF. См. Практическое руководство. Непосредственное выполнение команд против источника данных (http://msdn.microsoft.com/en-us/library/ee358769.aspx) HTH – OmegaMan

+0

Спасибо, я никогда не знал, что могу сделать это прямо из ссылки на объекты. – michael

2

Вы можете использовать DbSet<T>.Remove(entity) (версии 4.1, 4.2) или EntitySet<T>.Remove(entity) (Версия 1.0, 4.0) методы:

YourDbContext.Table.Remove(entityObject); 
+0

Снова, я думаю, вам нужно выбрать объект, прежде чем вы сможете его удалить? поэтому 2 поездки .. Я ошибаюсь? – michael

+0

Да, вы должны запросить объект, или вы можете использовать подход 'Attach', предложенный @hvd – Jan

2

Я использую для поиска элементов (ов) для удаления, а затем удалять их (их) с помощью метода DeleteObject.

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

использование этого внутри блока поймать Ьгу

+0

разве это не 2 поездки в БД? (т. е. выберите * from some_Table, где id = Id), затем (удалите foo из some_table где ..)? – michael

+0

Да, но если вы не хотите делать 2 раунда поездки в БД, вы больше всего используете SP, но вы сопоставляете команды Insert, Update и Delete с SP, если вы не начертите ни одного из них, вы получите исключение ExceptionException. – Piyey