2009-12-01 96 views
0

假设你有这样的表结构:在PLINQO中删除M:M的正确方法是什么?

病人 - > PatientTag - >标签

一个典型的N:患者和标签米之间的关系,PatientTag是既FKS中间实体。 (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(); 
      } 

感谢您对该主题的任何见解。

回答

1

简单地使用带级联删除的外键,然后删除标签本身并让数据库负责删除所有引用。如果你想确保它没有被使用,你可以先检查是否有任何患者与之相关联,但如果有其他进程访问同一个数据库,则可能需要将其包含在事务中。

+0

我忘记了这个基本想法:)谢谢。 – 2009-12-01 15:37:09

2

我同意tvanfosson在数据库上做它。另一种方式(可能更安全)将创建一个带格式的过程,并从你的代码中调用它。确保它的所有包装在一个交易中,可以在出现问题时处理回滚

+0

再次感谢Rippo,我添加了一个级联删除,它工作。有时答案在我们面前:) +1 – 2009-12-01 15:38:13

+0

还有一点评论:如果我要做的事情是否需要DataLoadOptions:dc.Manager.Tag.Delete(id); ? – 2009-12-01 15:39:24

+0

不,我不这么认为,只是打电话给删除,看看会发生什么! – Rippo 2009-12-01 15:59:04

相关问题