Обновление пары записей один-к-одному в entity framework/asp. netmvc 5
У меня есть абсолютный зверь некоторое время я пытался получить пару записей один-к-одному для обновления в Entity Framework. То, что, казалось бы, не должно быть таким уж трудным, не очень хорошо документировано в интернете и, похоже, настолько специализировано, что трудно найти источник, чтобы полностью изучить эту концепцию. Позвольте мне сначала сказать, что я смотрел это видео от MicrosoftРеализация Entity Framework с помощью MVC-часть 3/6-YouTube[^] и в нем действительно есть какая-то ценная информация. Видео действительно объясняет, что отношения один-к-одному в EF сложны и что вы должны специально сказать EF, что вы создаете отношения один-к-одному, указав в классе домена, что класс внешнего ключа является как первичным ключом, так и внешним ключом (см. мой код ниже или это видео выше).
Но то, с чем я здесь борюсь, - это концепция, что у бара есть адрес. У меня есть 2 класса доменов: Bar и Address. Внутри бар, там есть адрес и тип внутри адрес бар бар типа.
Вопрос в том, что в моей логике контроллера (я работаю с MVC) мне нужно сказать базе данных, чтобы она вытащила бар, а затем обновила адрес этого бара с помощью чего-то вроде этого:
barInDb = _context.Bars.SingleorDefault( b =>b.BarId == id); barInDb.Address.StreetName = bar.Address.StreetName;
Или мне нужно обновить Адреса класса напрямую подобный этому:
barInDb = _context.Bars.SingleorDefault( b =>b.BarId == id); addressInDb = _context.Addresses.SingleorDefault(a =>a.BarId == id); addressInDb.StreetName = bar.Address.StreetName;
Другими словами, чтобы правильно управлять этим типом отношений, я не знаю, как редактировать эти свойства. Операция не сложная: у меня есть форма, и я хочу сохранить адреса баров в адресной таблице, а остальную информацию о барах-в таблице баров. Когда пользователь редактирует панель в форуме редактирования панели и нажимает кнопку Отправить, я хочу, чтобы контроллер добавил информацию о панели в таблицу баров и информацию об адресе бара в таблицу адресов вместе с соответствующим BarId, чтобы они могли быть правильно сопряжены. Вот и все.
Однако в приведенном выше видео Microsoft используется много строительных лесов и автоматической помощи, и я не использовал это. Я предпочитаю писать свой код on с нуля и уже сделал это. Я связался с GitHub для этого кода на случай, если вы действительно захотите взглянуть на мой код. Для этого обратитесь к BarController, BarForm (в папке Views) и связанным с ними моделям домена адресов и баров.
Кроме того, смотрите код viewmodel ниже:
public class BarFormViewModel { public Address Address { get; set; } public Bar Bar { get; set; } public bool IsNew { get; set; } } }
Я передаю эту модель представления в свою форму вот так, но я пробовал много разных способов, так что это экспериментально:
public ActionResult Edit(int id) { var bar = _context.Bars.SingleOrDefault(b => b.BarId == id); //Make sure that the id actually exists: if (bar == null) { return HttpNotFound(); } if (bar.Address == null) { bar.Address.BarId = id; } var viewModel = new BarFormViewModel { Address = bar.Address, Bar = bar, IsNew = false }; return View("BarForm", viewModel); }
HappyHourBeerList/HappyHourBeerList at master · TheOnlyRealTodd/HappyHourBeerList · GitHub[^]
Что я уже пробовал:
Я попытался изменить форму бара, чтобы использовать Address.propertyHere, а также использовать панель.Адрес. недвижимость здесь. Я также пытался возиться с моим контроллером, чтобы использовать оба этих формата. При любых обстоятельствах код выполняется, но запись не обновляется.