Как правильно настроить метод в Web Api для JSON Post? - PullRequest
0 голосов
/ 20 сентября 2019

Мне нужно обновить / сохранить данные в БД, но столкнулся с проблемой: во время тестирования в Postman я проверил этот JSON:

{
"contactId": "1",
"contactName": "t4jnesfdv",
"company": {
  "companyName":"a546fghf"
   }
}

Он обновляет / сохраняет выбранную запись в таблице Contact, но такжедобавить новую запись в другую таблицу Company.

Во время тестирования в Postman я проверил этот JSON:

{
"contactId": "1",
"contactName": "t4jnesfdv",
"company": {
           "companyId":"2",
           "companyName":"a546fghf"
      }
}

Получить 500 Внутренняя ошибка сервера.

Интерфейс

public interface IContactService
{
    Task<bool> SaveContact(ContactModel contact);
}

Сервис

public async Task<bool> SaveContact(ContactModel contactModel)
{
    using (ContactDBContext db = new ContactDBContext())
    {
        Contacts contact = db.Contacts.Where
                 (x => x.ContactId == contactModel.ContactId).FirstOrDefault();
        if (contact == null)
        {

            contact = new Contacts()
            {
                ContactName = contactModel.ContactName,
                Company = contactModel.Company
            };
            db.Contacts.Add(contact);

        }
        else
        {
            contact.ContactName = contactModel.ContactName;
            contact.Company = contactModel.Company;
        }

        return await db.SaveChangesAsync() >= 1;
    }
}

Контроллер

[Route("api/[controller]")]
public class ContactController : Controller
{
    [HttpPost]
    [Route("SaveContact")]
    public async Task<IActionResult> SaveContact([FromBody] ContactModel model)
    {
        return Ok(await _contactService.SaveContact(model));
    }
}

Модели

public class CompanyModel
    {
        public int CompanyId { get; set; }
        public string CompanyName { get; set; }
        public ICollection<Contacts> Contacts { get; set; }
    }
public class ContactModel
    {
        public int ContactId { get; set; }
        public string ContactName { get; set; }
        public Company Company { get; set; }
    }

Объекты

public class Company
    {
        public int CompanyId { get; set; }
        [StringLength(150)]
        public string CompanyName { get; set; }
        public ICollection<Contacts> Contacts { get; set; }
    }
public class Contacts
    {
        [Key]
        public int ContactId { get; set; }
        public string ContactName { get; set; }
        public Company Company { get; set; }
    }

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

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019

Попробуйте это

public async Task<bool> SaveContact(ContactModel contactModel)
    {
        using (ContactDBContext db = new ContactDBContext())
        {
            Contacts contact = db.Contacts.Where
                     (x => x.ContactId == contactModel.ContactId).FirstOrDefault();
            if (contact == null)
            {

                contact = new Contacts()
                {
                    ContactName = contactModel.ContactName,
                    Company = contactModel.Company
                };
                db.Contacts.Add(contact);

            }
            else
            {
                contact.ContactName = contactModel.ContactName;
                contact.Company.CompanyId = contactModel.Company.CompanyId;
            }

            return await db.SaveChangesAsync() >= 1;
        }
    }
0 голосов
/ 23 сентября 2019

Я переписал свой контактный объект и модель (и обновил базу данных):

public class Contacts
    {
        [Key]
        public int ContactId { get; set; }
        public string ContactName { get; set; }
        [Display(Name = "Company")]
        public int? CompanyId { get; set; }
        [ForeignKey("CompanyId")]
        public Company Companies { get; set; }
    }

Переписал сервис:

public async Task<bool> SaveContact(ContactModel contactModel)
        {
            using (ContactDBContext db = new ContactDBContext())
            {
                Contacts contact = db.Contacts.Where
                         (x => x.ContactId == contactModel.ContactId).FirstOrDefault();
                if (contact == null)
                {
                        contact = new Contacts()
                    {
                        ContactName = contactModel.ContactName,
                        CompanyId = contactModel.CompanyId
                };
                    db.Contacts.Add(contact);
                    }
                else
                {
                    contact.ContactName = contactModel.ContactName;
                    contact.CompanyId = contactModel.CompanyId;
                }

                return await db.SaveChangesAsync() >= 1;
            }
        }

И проверил мой Web Api в Postman с этим JSON:

{
        "contactId": 2,
        "contactName": "1try93445",
        "companyId": "7"
    }

Все работало как надо.

0 голосов
/ 20 сентября 2019

Я думаю, Company является дочерней таблицей в вашей базе данных, поэтому в случае обновления вы должны сначала извлечь этот объект компании из базы данных, а затем обновить его значение, используя его объект

Contacts contact = db.Contacts.Where(x => x.ContactId == contactModel.ContactId).FirstOrDefault();

Company company = db.Companies.Where(x => x.ContactId == contactModel.ContactId).FirstOrDefault();

 contact.ContactName = contactModel.ContactName;
 contact.Company.CompanyName = contactModel.Company.CompanyName;
...