|
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
|
|||
---|---|---|---|
#18+
Есть две таблицы и таблица связей (ТС), которая организует отношение "много ко многим" между первыми двумя таблицами. При удалении данных из одной таблицы надо удалить соответствующие данные и из другой, не говоря о том, чтобы удалить ещё и связи из ТС. Но если из ТС можно автоматом удалить через всякие правила каскадного удаления, то как с минимальным количеством запросов удалить данные из второй таблицы с помощью Entity Framework? Раньше я делал так: 1. Запрашиваю из ТС идентификаторы объектов, относящихся к удаляемому объекту первой таблицы. 2. Циклом прохожу по полученной коллекции идентификаторов, где в теле цикла удаляю каждый объект второй таблицы отдельно. Т. е. делаю два запроса. У меня такое ощущение всё время возникает, что я делаю лишнюю работу. А можно ли как-нибудь удалить из второй таблицы все связанные объекты автоматом? Не через хранимые процедуры и пр. - только с помощью возможностей Entity Framework или задания свойств таблицы при её создании. Вот в 4 версии всякие связи, отражающие отношения (т. е. ссылки на связанные отношением таблицы), ко всем объектам БД стали добавлять - может, они помогут? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2011, 13:02 |
|
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
|
|||
---|---|---|---|
#18+
>> 1. Запрашиваю из ТС идентификаторы объектов, относящихся к удаляемому объекту первой таблицы. Правильно будет: 1. Запрашиваю из ТС идентификаторы объектов второй таблицы, относящихся к удаляемому объекту первой таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2011, 13:03 |
|
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
|
|||
---|---|---|---|
#18+
Наверх. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2011, 11:29 |
|
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2011, 10:40 |
|
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
|
|||
---|---|---|---|
#18+
если настройка модели не Concurrency Mode=Fixed ( проверяются все колонки) а первичные ключи удаляемых сущностей известны, то можно схитрить, создав пустые объекты // Delete without loading f = new Flight() { FlightNo = flightNo}; modell.Flight.Attach(f); modell.DeleteObject(f); ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2011, 10:48 |
|
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
|
|||
---|---|---|---|
#18+
Про аттачи и удаления без загрузки полных данных я знаю - я такой же способ и описал в своём первом посте. Я спрашивал про другое - как одним запросом удалить не только сам экземпляр сущности, но и связанные с ним через таблицу связей экземпляры другой сущности. Я писал, что мне приходится грузить идентификаторы экземпляров, а потом уже через аттачи удалять их. Я хочу, чтобы их не надо было грузить, а они удалялись автоматом. Без написания хранимых процедур. Только с помощью настроек БД и отношений. Это какой-то тривиальный случай - должно очень просто решаться. Если это, конечно, предусмотрено СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2011, 20:04 |
|
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
|
|||
---|---|---|---|
#18+
user7320, приведённая ссылка и говорит о том, что выбранный до сих пор вариант- самый эффективный, ибо не нужно загружать все сущности ( хранимая процедура , конечно, ещё быстрее) с другой стороны, код выглядит, конечно, криво; если хочется грузить все связанные сущности, а потом одним махом удалять, то нужно смотреть в сторону cascade delete: http://blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/814e7fbc-ff04-41fc-8ae0-92bc0238638d/ ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2011, 21:55 |
|
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
|
|||
---|---|---|---|
#18+
Bob Dylanесли хочется грузить все связанные сущности, а потом одним махом удалять, то нужно смотреть в сторону cascade delete: http://blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/814e7fbc-ff04-41fc-8ae0-92bc0238638d/ Вы, наверное, не не совсем поняли меня. Но спасибо вам за ссылку - я понял, что работать EF может только с теми объектами, что загружены в ObjectContext, поэтому удаляемые объекты или их обрубки (stubs в виде только идентификаторов) надо обязательно предварительно загрузить. Я постараюсь объяснить на своём конкретном примере. У меня есть таблица Image и таблица News. Связаны отношением "много ко многим" через таблицу связей Image_News. Правило для удалений стоит каскадоное. Cuncurensy не использую. Как я делаю обычно: по известному exemplarId новости сначала удаляю все изображения, а потом удаляю саму новость: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Как видно, связи удаляются автоматом по каскадному правилу, поэтому явного кода их удаления тут нет. Так вот, хотелось бы "руками" удалить только новость, связанные с ней изображения чтобы тоже удалялись на автомате. Как это сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2011, 22:49 |
|
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
|
|||
---|---|---|---|
#18+
Как видите, я не гружу полные объекты, а только их обрубки в виде идентификаторов. Но не в этом проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2011, 22:50 |
|
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
|
|||
---|---|---|---|
#18+
Так вот, хотелось бы "руками" удалить только новость, связанные с ней изображения чтобы тоже удалялись на автомате. Как это сделать? Следует читать Так вот, хотелось бы "руками" удалить только новость, а связанные же с ней изображения чтобы удалялись на автомате. Как это сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2011, 22:53 |
|
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
|
|||
---|---|---|---|
#18+
user7320, может, я чего не понимаю, но в ссылке http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/814e7fbc-ff04-41fc-8ae0-92bc0238638d/ чёрным по белому описано, каk это делать: ключевая фраза "setting the Cascade Delete attribute on the SSDL", тут проблема в том, что эта настройка при новой генерации конечно же "слетает", т.е. каждый раз после изменения дб и новой генерации модели ручками придётся подправлять всё остальное, это 1) создаётся a corresponding DELETE rule in the database http://drc.ideablade.com/xwiki/bin/view/Documentation/code-sample-cascading-deletes 2) всё вместе загружается а ля news.include"Image" 3) удаляется за раз как следствие, код становится "красивше", но это- за счёт производительности ( тут include "аукнется") ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2011, 01:40 |
|
|
start [/forum/topic.php?fid=17&fpage=39&tid=1350544]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
28ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 152ms |
0 / 0 |