Как сначала вставить дочерние данные, а затем родительские данные и дочернее вставленное удостоверение с помощью Entity Framework Core

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

{
    "StudentId": 111001,
    "StudentName": "Gaurav Singh",
    "Address": 
    [
        {
            "AddressId" : 223344,
            "AddressType": 1,
            "StudentId" : 111001,
            "AddressLine1": "Noida Sec 15",
            "City": "Noida",
            "State": "U.P.",
            "Country": "India",
            "PhoneId":311386
            "PhoneNumber": {
                "PhoneId": 311386,
                "PhoneNumber": "123456789"
            }
        },
        { // this my new entry in database which is not getting inserted.
            "AddressId" : null,
            "AddressType": 2,
            "StudentId" : 111001,
            "AddressLine1": "Noida Sec 18",
            "City": "Noida",
            "State": "U.P.",
            "Country": "India",
            "PhoneId":0
            "PhoneNumber": {
                "PhoneId": NULL,
                "PhoneNumber": "2233445566"
            }
        }
    ]
}

Теперь в моем коде я пытаюсь использовать приведенный ниже код, но он не работает при обновлении существующих данных, но для всей новой записи он работает нормально.

foreach (var _adressData in data.Addresses.ToList())
{
    var _address = _context.Address
                           .Where(p => p.AddressId == _adressData.AddressId)
                           .FirstOrDefault();

    if (_address != null)
    {
        _context.Entry(_address).CurrentValues.SetValues(_adressData);
    }
    else
    {
        var _adr = new Address
        {
            AddressId = null,
            AddressType = 2,
            StudentId = 111001,
            AddressLine1 = "Noida Sec 18",
            City = "Noida",
            State = "U.P.",
            Country = "India",
            PhoneNumber = new PhoneNumberEntity{
                PhoneId = NULL,
                PhoneNumber = "2233445566"
            }
        };

        currentData.Address.Add(_adr);
    }
}

await _context.SaveChangesAsync();
return currentData;

У кого-нибудь есть предложения?

Классы -

public class student {
    public int StudentId {get;set;}
    public string StudentName {get;set;}
    public ICollection<AddressEntity> Addresses {get;set;}}

public class AddressEntity {
    public int StudentId {get;set;}
    public int AddressType {get;set;}
    public int PhoneId {get;set;}
    public string AddressLine1 {get;set;}
    public string City {get;set;}
    public string State {get;set;}
    public string Country {get;set;}
    public PhoneEntity PhoneNumber {get;set;} }

public class PhoneEntity {
    public int PhoneId {get;set;}
    public string PhoneNumber {get;set;} }

Спасибо


person Mr. Gaurav Singh Rathore    schedule 19.02.2021    source источник
comment
Можете ли вы показать свой адресный класс, пожалуйста? И Студент тоже?   -  person Serge    schedule 19.02.2021
comment
Я все еще не вижу ваш класс адресов. Я отмечу, что ваш вопрос неясен.   -  person Serge    schedule 19.02.2021
comment
дается подробная информация о занятиях.   -  person Mr. Gaurav Singh Rathore    schedule 19.02.2021
comment
у вас есть ошибка - 2 свойства PhoneNumber в одном классе, я не знаю, как вы могли его скомпилировать. Пожалуйста, покажите реальные данные.   -  person Serge    schedule 19.02.2021
comment
И вы не могли назначить PhoneId = NULL, так как он не может быть нулевым   -  person Serge    schedule 19.02.2021
comment
даже я пытался отправить 0 в эти поля, но новый адрес не вставлялся.   -  person Mr. Gaurav Singh Rathore    schedule 19.02.2021
comment
Моя точка зрения - строка: currentData.Address.Add(_adr); не добавляет новую запись адреса с новыми данными номера телефона   -  person Mr. Gaurav Singh Rathore    schedule 19.02.2021
comment
Да я знаю почему не добавляется и почему не обновляется. Чтобы исправить ваш код, мне нужны ваши настоящие данные. Вы не сможете скомпилировать код, который вы мне показываете.   -  person Serge    schedule 19.02.2021
comment
он обновляет данные, и, пожалуйста, не переходите к косметическому промаху, я на самом деле не могу опубликовать здесь полную структуру, она слишком длинная и проблема, с которой я сталкиваюсь при добавлении другой записи для адреса, даже если я обновляю предыдущие данные адреса, которые обновляется в БД.   -  person Mr. Gaurav Singh Rathore    schedule 19.02.2021


Ответы (2)


Проблема заключается в том, что ваше свойство PhoneEntity PhoneNumber является виртуальным. Чтобы дать вам настоящий код, мне нужен от вас настоящий код. Теперь могу только предложить:


if (_address != null)
    {

       var phone = _context.Phone
                           .Where(p => p.PhoneId == _adressData.PhoneId)
                           .FirstOrDefault();
  if (phone != null)   _context.Entry(Phone).CurrentValues.SetValues(_adressData.Phone);
     
          _adressData.Phone=null;
       
         _context.Entry(_address).CurrentValues.SetValues(_adressData);
       
    }
person Serge    schedule 19.02.2021

public class student {
    public int StudentId {get;set;}
    public string StudentName {get;set;}
    public ICollection<AddressEntity> Addresses }

Во-первых, для класса Student попробуйте добавить методы get и set для свойства Addresses.

public class Student
{
    public int StudentId { get; set; }
    public string StudentName { get; set; }
    public ICollection<AddressEntity> Addresses { get; set; }
}

Во-вторых, в методе Edit Post попробуйте сослаться на следующий пример, чтобы обновить модель:

   [HttpPost]
    public IActionResult Edit(Student student)
    { 
        //based on the student's StudentId property to find the existing item from the database.
        var existStudent = _context.Students
            .Include(c=>c.Addresses).ThenInclude(c=>c.PhoneNumber)
            .Where(c => c.StudentId == student.StudentId).FirstOrDefault();

        //define a list to store the student's address.
        var address = new List<AddressEntity>();

        if(existStudent != null)
        {
            //loop through the address list from the student (post parameters).
            foreach (var _adressData in student.Addresses.ToList())
            {
                //check if the address is exist or not.
                var _address = _context.Addresses
                                       .Where(p => p.AddressId == _adressData.AddressId)
                                       .FirstOrDefault();

                if (_address != null)
                {
                    //update the exist address.
                    _context.Entry(_address).CurrentValues.SetValues(_adressData); //update the existing address.
                    //add the existing address to the list.
                    address.Add(_address);
                }
                else
                {
                   //add new address object to the list.
                   address.Add(_adressData);
                }
            }
            existStudent.Addresses = address; //set address for the student.
        }
        _context.SaveChanges(); //call the SaveChange method 

        var latestdata = _context.Students.ToList();

        return View();
    }

Результат такой (до редактирования существующий студент содержал один Адрес, после изменения содержит два адреса):

введите здесь описание изображения

person Zhi Lv    schedule 22.02.2021