无法从MVC中存在外键的表中删除行

时间:2010-10-01 10:49:53

标签: linq-to-sql

在我的mvc应用程序中,我有两个名为的表:     与外键关系相关的详细信息(srNo,ID,工作),主(ID,名称,计划)使用“ID”字段从详细信息发送到主数据。  “ID”字段是主表的主键。 “srNo”字段是详细信息表的主键。

在“ID”字段中,这2个表与外键关系船连接。

现在的问题是: 在向数据库添加任何行时,我们首先在主表中进行输入,然后在详细信息表中进行输入。 有时由于某些异常,在主表中成功添加行但无法添加详细信息表。然后我想从主表执行回滚。

但是当我想要删除最近添加了ID值的行(grom linq to sql)时,这是在主表中添加的,它给了我一个例外,即forign key realtion ship就在那里......

此时详细信息表中没有该id字段的行。

由于

3 个答案:

答案 0 :(得分:0)

它接缝也将数据插入子表中。首先,您必须使用deleteallonsubmit(detail)从详细信息表中删除,然后从主表中删除。你能解释一下异常是什么意思,是错误还是验证

public ActionResult CreateRec(Master _Master, IEnumerable<Detail> Detaildata,FormCollection collection)
{
  MasterRepo _MasterRepo = new MasterRepo();
  if (ModelState.IsValid)
        {
            if (_detail != null)
            {
                foreach (var objdetail in DetailData)
                {
                    Detail _Detail = new Detail();
                    _Detail.FirstField = objdetail.FirstField;
                   _Detail.SecondField = objdetail.SecondtField;
                    _Master.Detail.Add(_Detail);
                }
            }
          _MasterRepo.Save();  
        }

}

答案 1 :(得分:0)

这是代码

master objmaster = new master(); objmaster.id = count; objmaster.name = name1; ..   objEntities.AddObject(“master”,objmaster);   objEntities.SaveChanges(); 尝试 {    detail objDetail =新细节()     master objMaster =(来自objEntities.master中的r,其中r.Id == count select r).First();     objDetail.master = objMaster;      //假设我得到任何(格式,空指针异常)      objDetail.folow = sfields [0];      //如果出现异常,下面的代码将不会被删除

objEntities.AddObject(“detail”,objDetail);   objEntities.SaveChanges(); } catch(Exception ex) {

//这里我要删除我在主表中添加的行:    //我为此编写代码    master objMasters =(from r in objEntities.master,其中r.Id == count select r).ToList();    objEntities.DeleteObject(objMasters);    objEntities.SaveChanges(); }

答案 2 :(得分:0)

我认为您需要将它们一起提交,以便它们处于同一个交易中。然后就不需要编写回滚代码,因为如果细节失败,主文件将不会被插入。 试试这个:

master objmaster= new master(); 
objmaster.id =count; 
objmaster.name= name1; 
.. 
objEntities.AddObject("master", objmaster); 
// == removed save changes call here ==
detail objDetail = new detail() 
// == no need to reselect master from the database, you already have it
// == so just assign it, and that will take care of the references/foreign-key
objDetail.master = objMaster; // Suppose I get any (format, null pointer exception here) 
objDetail.folow = sfields[0]; //In case of exception this below code will not be excecuted

objEntities.AddObject("detail", objDetail); 
// == save at the end ==
objEntities.SaveChanges();