2014-04-22 4 views
1

Ситуация: У меня есть 3 таблицы:C# Удаление строки из нескольких таблиц

  • movies (pk:movietitle, movielength .... и т.д.)
  • rentals (pk:personid, fk:movietitle, ... и т.д.)
  • rentingpeople (pk+fk:personid, name, phone .. .etc)

В моей форме есть привязка listbox, содержащая названия фильмов, рядом со списком есть текстовые поля bindingsourc ред от db.movies

Когда кто-то нажать на кнопку rentthismovie Я хотел бы, чтобы удалить текущие АРЕНДЫ данные об этом фильме из таблицы rentals и rentingpeople.

я написал первую часть и получить ошибку из-за внешнюю проблемой ключей (я уже упоминал первичный ключ, как pk и внешний ключ, как fk в таблицах выше)

var search = (from g in db.Rentals 
       where g.Movietitle == (string)listBox1.SelectedValue select g).First(); 

db.Rentals.DeleteObject(search); 
db.SaveChanges(); 

Я получаю сообщение об ошибке:

The DELETE statement conflicted with the REFERENCE constraint \"FK_Rentingpeople_Rentals\". The conflict occurred in database \"C:\USERS\PC\DOCUMENTS\VISUAL STUDIO 2010\PROJECTS\FILMEK\FILMEK\BIN\DEBUG\DATABASE1.MDF\", table \"dbo.Rentingpeople\", column 'personid'.\r\nThe statement has been terminated.

Из-за подключения к первичному-внешнему ключу я должен удалить данные из таблицы rentingpeople, так как я прочитал эту ошибку, но не могу найти рабочего решения.

+0

У вас есть другой стол, где вы храните информацию о людях, которые являются «членами», и можете арендовать, кроме вашей таблицы «rentingpeople»? – Floremin

ответ

0

Перед удалением объекта необходимо удалить все PK, а не нулевые ссылки на объект, который вы удаляете.
Вы можете изменить столбцы с нулевым значением до нулевых значений, если позволяет логика.

var rentalsToBeDeleted = db.Rentals.Where(o =>o.movieid == movieid).ToList(); 
for (int i = rentalsToBeDeleted.count; i < 0; i--) 
{ 
db.Rentals.DeleteObject(rentalsToBeDeleted.elementAt(i)); 
} 

после того, как все ссылки удалены.

db.SaveChanges(); 

письменной форме без VS, поэтому ошибки могут возникнуть, но вы должны получить эту идею.

+0

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

+0

к сожалению, элементы и delete: не содержит определения и не использует метод расширения ... – user3551399

+0

добавить в список в конце db.Rentals.Where (o => o.movieid == movieid) .ToList(); –

2

Проблема заключается в разработке БД

movies(pk:movietitle,movielength....etc) 
rentals(pk:personid,fk:movietitle,...etc) 
rentingpeople(pk+fk:personid,name,phone...etc) 

Если бы я получил это право, movies содержит список фильмов, rentingpeople список людей, которые арендуют или арендовали, и rentals дорожек для аренды. Если да, то rentingpeople.personid должен быть рк и rentals.personid должен быть Ф.К. к другому, как это:

  • фильмы (рк: MovieTitle, movielength .... и т.д.)
  • аренда (Ф.К.: PersonID, Д: MovieTitle, ... и т.д.)
  • rentingpeople (рк: PersonID, имя, телефон ...и т.д.)

, если вы хотите улучшить поиск по аренде (предполагается, что любой человек может осуществлять несколько проката в то же время), вы можете ввести не уникальный индекс на PersonId, или композитный уникальный индекс PersonId и movietitle по таблице rentals

+0

i changed теперь я получаю сообщение об ошибке: Не удалось обновить EntitySet «Аренда», потому что в элементе существует элемент DefiningQuery и no для поддержки текущей операции. – user3551399

+0

@ user3551399 Вы используете EF? Я думаю, что это проблема с ef, что вам нужно pk в каждой таблице, если это так, поместите PK в таблицу аренды, например, вы можете сделать 'PK (personid, movietitle)' – Jason

Смежные вопросы