0

次のテーブル構造があるとします。

患者 -> 患者タグ -> タグ

患者とタグ間の典型的な N:M 関係で、PatientTag は両方の FK を持つ中間エンティティです。(PatientId および TagId)。

特定のタグを削除したいのですが、その ID があります。私はこれを行っていますが、より良い方法があるかどうかを知りたいです。これらは 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();
            }

この件に関する洞察をありがとう。

4

2 に答える 2

2

私はtvanfossonがデータベースでそれを行うことに同意します。別の方法 (より安全かもしれません) は、ストアド プロシージャを作成し、それをコードから呼び出すことです。何か問題が発生した場合に備えて、ロールバックを処理できるトランザクションにすべてがまとめられていることを確認してください

于 2009-12-01T14:32:08.713 に答える
1

カスケード削除で外部キーを単純に使用してから、タグ自体を削除し、データベースにすべての参照の削除を任せるのはどうでしょうか。使用されていないことを確認したい場合は、最初に関連付けられている患者がいないことを確認できますが、同じデータベースにアクセスする他のプロセスがある場合は、トランザクションでラップする必要がある場合があります。

于 2009-12-01T13:26:18.940 に答える