Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF? / 11 сообщений из 11, страница 1 из 1
29.11.2011, 13:02
    #37549723
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
Есть две таблицы и таблица связей (ТС), которая организует отношение "много ко многим" между первыми двумя таблицами. При удалении данных из одной таблицы надо удалить соответствующие данные и из другой, не говоря о том, чтобы удалить ещё и связи из ТС. Но если из ТС можно автоматом удалить через всякие правила каскадного удаления, то как с минимальным количеством запросов удалить данные из второй таблицы с помощью Entity Framework?

Раньше я делал так:

1. Запрашиваю из ТС идентификаторы объектов, относящихся к удаляемому объекту первой таблицы.

2. Циклом прохожу по полученной коллекции идентификаторов, где в теле цикла удаляю каждый объект второй таблицы отдельно.

Т. е. делаю два запроса. У меня такое ощущение всё время возникает, что я делаю лишнюю работу.

А можно ли как-нибудь удалить из второй таблицы все связанные объекты автоматом? Не через хранимые процедуры и пр. - только с помощью возможностей Entity Framework или задания свойств таблицы при её создании. Вот в 4 версии всякие связи, отражающие отношения (т. е. ссылки на связанные отношением таблицы), ко всем объектам БД стали добавлять - может, они помогут?
...
Рейтинг: 0 / 0
29.11.2011, 13:03
    #37549727
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
>> 1. Запрашиваю из ТС идентификаторы объектов, относящихся к удаляемому объекту первой таблицы.

Правильно будет:

1. Запрашиваю из ТС идентификаторы объектов второй таблицы, относящихся к удаляемому объекту первой таблицы.
...
Рейтинг: 0 / 0
02.12.2011, 11:29
    #37555642
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
Наверх.
...
Рейтинг: 0 / 0
03.12.2011, 10:40
    #37557320
Bob Dylan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
...
Рейтинг: 0 / 0
03.12.2011, 10:48
    #37557323
Bob Dylan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
если настройка модели не Concurrency Mode=Fixed ( проверяются все колонки) а первичные ключи удаляемых сущностей известны, то можно схитрить, создав пустые объекты
// Delete without loading
f = new Flight() { FlightNo = flightNo};
modell.Flight.Attach(f);
modell.DeleteObject(f);
...
Рейтинг: 0 / 0
03.12.2011, 20:04
    #37557744
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
Про аттачи и удаления без загрузки полных данных я знаю - я такой же способ и описал в своём первом посте. Я спрашивал про другое - как одним запросом удалить не только сам экземпляр сущности, но и связанные с ним через таблицу связей экземпляры другой сущности. Я писал, что мне приходится грузить идентификаторы экземпляров, а потом уже через аттачи удалять их. Я хочу, чтобы их не надо было грузить, а они удалялись автоматом.

Без написания хранимых процедур. Только с помощью настроек БД и отношений.

Это какой-то тривиальный случай - должно очень просто решаться. Если это, конечно, предусмотрено СУБД.
...
Рейтинг: 0 / 0
03.12.2011, 21:55
    #37557845
Bob Dylan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
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/
...
Рейтинг: 0 / 0
03.12.2011, 22:49
    #37557881
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
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.
// Delete the images related to the novelty being deleted.
foreach (var imageId in from i_ns in db.Image_News
                        where i_ns.NewsId == exemplarId
                        select i_ns.ImageId)
{
    Image i = new Image { ImageId = imageId };
    db.AttachTo("Image", i);
    db.DeleteObject(i);
}

// Delete the novelty directly.
News n = new News { NewsId = exemplarId };
db.AttachTo("News", n);
db.DeleteObject(n);

db.SaveChanges();



Как видно, связи удаляются автоматом по каскадному правилу, поэтому явного кода их удаления тут нет. Так вот, хотелось бы "руками" удалить только новость, связанные с ней изображения чтобы тоже удалялись на автомате. Как это сделать?
...
Рейтинг: 0 / 0
03.12.2011, 22:50
    #37557882
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
Как видите, я не гружу полные объекты, а только их обрубки в виде идентификаторов. Но не в этом проблема.
...
Рейтинг: 0 / 0
03.12.2011, 22:53
    #37557886
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
Так вот, хотелось бы "руками" удалить только новость, связанные с ней изображения чтобы тоже удалялись на автомате. Как это сделать?
Следует читать

Так вот, хотелось бы "руками" удалить только новость, а связанные же с ней изображения чтобы удалялись на автомате. Как это сделать?
...
Рейтинг: 0 / 0
04.12.2011, 01:40
    #37558006
Bob Dylan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF?
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 "аукнется")
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Какой самый быстрый способ удаления данных через отношение "много ко многим" с помощью EF? / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]