Невозможно удалить строку из таблицы, в которой существует внешний ключ в MVC - PullRequest
0 голосов
/ 01 октября 2010

В моем приложении MVC у меня есть 2 таблицы с именем: деталь (srNo, ID, работа), мастер (ID, имя, план), связанные с отношением внешнего ключа от детали к мастеру с использованием поля «ID». Поле «ID» является первичным ключом главной таблицы. Поле "srNo" является первичным ключом таблицы сведений.

Из поля «ID» эти 2 таблицы объединяются с отношениями внешних ключей.

Теперь проблема заключается в: При добавлении любой строки в базу данных мы сначала делаем запись в основной таблице, затем в таблице подробностей. И иногда из-за какого-то исключения, когда строка успешно добавляется в основную таблицу, но не может быть добавлена ​​в детальную таблицу. Затем я хочу выполнить откат с главной таблицы.

Но когда я хочу удалить строку с недавно добавленным значением идентификатора (grom linq to sql), которая добавлена ​​в основную таблицу, это дает мне исключение, что там есть корабль реализации чужих ключей .....

И в то время в подробной таблице нет строки этого поля id.

Спасибо

Ответы [ 3 ]

0 голосов
/ 01 октября 2010

Вот код

master objmaster = новый мастер (); objmaster.id = количество; objmaster.name = name1; .. objEntities.AddObject ("master", objmaster); objEntities.SaveChanges (); пытаться { деталь objDetail = новая деталь () master objMaster = (из r в objEntities.master, где r.Id == count select r) .First (); objDetail.master = objMaster; // Предположим, я получаю любое (формат, исключение нулевого указателя здесь) objDetail.folow = sfields [0]; // В случае исключения этот код ниже не будет исключен

objEntities.AddObject ("detail", objDetail); objEntities.SaveChanges (); } поймать (исключение ex) {

// Здесь я хочу удалить строку, которую я добавил в основную таблицу: // Я пишу код для этого master objMasters = (из r в objEntities.master, где r.Id == count select r) .ToList (); objEntities.DeleteObject (objMasters); objEntities.SaveChanges (); }

0 голосов
/ 24 октября 2013

Я думаю, вам нужно отправить их обоих вместе, чтобы они были в одной транзакции.Тогда нет необходимости писать код отката, так как мастер не будет вставлен, если деталь потерпит неудачу.Попробуйте вместо этого:

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(); 
0 голосов
/ 01 октября 2010

он показывает, что данные также вставляются в дочернюю таблицу. сначала необходимо удалить из таблицы сведений с помощью 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();  
        }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...