Правильный способ удалить M: M в PLINQO? - PullRequest
0 голосов
/ 01 декабря 2009

Предположим, у вас есть такая структура таблицы:

Patient -> PatientTag -> Tag

Типичное отношение N: M между пациентами и тегами, PatientTag является промежуточным объектом с обоими FK. (PatientId и TagId).

Я хочу удалить конкретный тег, у меня есть его идентификатор. Я делаю это, но я хотел бы знать, есть ли лучший способ, так как это первый метод, который я пишу с использованием PLINQO, я бы не хотел создавать плохие практики с самого начала

            using ( MyDataContext dc = DataContextFactory.GetDataContext() )
            {

                var options = new DataLoadOptions();
                options.LoadWith<Paciente>(p => p.PacienteTagList);
                options.LoadWith<PacienteTag>(pt => pt.Tag);
                dc.LoadOptions = options;

                // Get the Tag we're going to remove from the DB.
                var tag = dc.Manager.Tag.GetByKey( idTag);

                // Remove each patient from the association. 
                foreach ( Paciente pac in tag.PacienteList1 )
                {
                    // we need to retrieve it, won’t let us use the ‘pac’ object.
                    var pax = dc.Manager.Paciente.GetByKey( pac.IdPaciente );
                    pax.TagList.Remove(tag);
                }

                // now remove the tag
                dc.Manager.Tag.Delete(tag.TagId);

                // And commit the changes
                dc.SubmitChanges();
            }

Спасибо за понимание этого вопроса.

Ответы [ 2 ]

2 голосов
/ 01 декабря 2009

Я согласен с tvanfosson сделать это в базе данных. Другим способом (может быть более безопасным imho) будет создание обработанной процедуры и вызов ее из вашего кода. Убедитесь, что все это включено в транзакцию, которая может иметь дело с откатами на случай, если что-то пойдет не так

1 голос
/ 01 декабря 2009

Как насчет простого использования внешнего ключа с каскадным удалением, затем удаления самого тега и предоставления возможности базе данных позаботиться об удалении всех ссылок. Если вы хотите убедиться, что он не используется, вы можете проверить, что с ним в первую очередь не связано ни одного пациента, хотя вам может потребоваться заключить его в транзакцию, если другие процессы обращаются к той же базе данных. 1001 *

...