TheOnlyRealTodd Ответов: 0

Обновление пары записей один-к-одному в 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, а также использовать панель.Адрес. недвижимость здесь. Я также пытался возиться с моим контроллером, чтобы использовать оба этих формата. При любых обстоятельствах код выполняется, но запись не обновляется.

0 Ответов