Как обновить несколько таблиц с внешними ключами, используя выражение LINQ ASP. NET MVC Entity Framework - PullRequest
0 голосов
/ 09 февраля 2020

Я новичок в программировании, и я пытался обновить несколько таблиц, используя выражения LINQ,

using (ADBEntities _ADBEntities = new ADBEntities())
{
    try
    {
        tblPerson _Person = new tblPerson();
        _Person.Id = PersonDetails.Id;
        _Person.Firstname = PersonDetails.Firstname;
        _Person.LastName = PersonDetails.LastName;
        _Person.DOB = PersonDetails.DOB;
        _Person.SSN = PersonDetails.SSN;

        var updatePersonDetails = _IPersonRepository.Update(_Person);

        if (updatePersonDetails != null)
        {   
            tblAddress _Address = new tblAddress();
            _Address.PersonId = updatePersonDetails.Id;
            var updateAddressDetails = _ADBEntities.tblAddresses.Find(_Address.PersonId);
            _Address.Id = updateAddressDetails.Id;
            _Address.Address = PersonDetails.Address;

            _ADBEntities.Entry(updateAddressDetails).CurrentValues.SetValues(_Address);
            _ADBEntities.SaveChanges(); 

            if (updateAddressDetails != null)
            {
                tblEmail _Email = new tblEmail();
                _Email.PersonId = updateAddressDetails.PersonId;
                var updateEmailDetails = _ADBEntities.tblEmails.Find(_Email.PersonId);
                _Email.Id = updateEmailDetails.Id;
                _Email.Email = PersonDetails.Email;

                _ADBEntities.Entry(updateEmailDetails).CurrentValues.SetValues(_Email);
                _ADBEntities.SaveChanges();

                if (updateEmailDetails != null)
                {
                    tblPhone _Phone = new tblPhone();
                    _Phone.PersonId = updateEmailDetails.Id;
                    var updatePhoneDetails = _ADBEntities.tblPhones.Find(_Phone.PersonId);
                    _Phone.Id = updatePhoneDetails.Id;
                    _Phone.PhoneNo = PersonDetails.PhoneNo;

                    _ADBEntities.Entry(updatePhoneDetails).CurrentValues.SetValues(_Phone);
                    _ADBEntities.SaveChanges();
                }
            }
        }
    }
}

Вначале это работало нормально, но теперь выдает исключение "объектная ссылка на ноль".

Таблицы

tblPerson
tblAddress
tblPhone
tblEmail

1 Ответ

0 голосов
/ 09 февраля 2020

Вы не проверяете свой «Найти», если он успешен. Вероятно, это ноль. Шаблон, который вы используете для обновления Предмета, немного устарел, я приведу пример вашего самого внутреннего обновления.

if (updateEmailDetails != null)
{
    tblPhone _Phone  = _ADBEntities.tblPhones.Find(updateEmailDetails.Id);
    if (_Phone != null)
       _Phone.PhoneNo = PersonDetails.PhoneNo;
}

Вот и все SaveChanges, которые вы можете вызвать в конце, один раз для всех обновлений

 _ADBEntities.SaveChanges(); 

То, что вы сделали с созданием новой записи, иногда делается для обновления записи, без предварительного извлечения ее из базы данных. Но вы делаете выборку (с помощью Find). В этом случае вы можете go простой путь по умолчанию.

...