Почему мой веб-Api, использующий Entity Framework 6, продолжает записывать новые повторяющиеся записи, а не обновлять их?

#api #web #model-view-controller #entity-framework-6

#API #веб #model-view-controller #entity-framework-6

Вопрос:

Я создал свою базу данных в Entity Framework, а также создал веб-Api, который использует Entity Framework. Когда я выполняю GET или POST (ADD), все работает отлично, но когда я выполняю PUT (Update), моя запись не обновляется, она добавляется, как если бы я выполнил Post. Я думаю, что следующее не распознает, что объект был изменен:

 db.Entry(contact).State = EntityState.Modified;
 

Итак, вот весь мой Entity Contact.cs, созданный Entity Framework:

   public partial class Contact
    {
        public int Contact_ID { get; set; }
        public int Dataset_ID { get; set; }
        public string Booth_UCID { get; set; }
        public string First_Name { get; set; }
        public string Last_Name { get; set; }
        public string Title_Role { get; set; }
        public int Contact_Type_ID { get; set; }
        public string Email { get; set; }
        public string Phone_Number { get; set; }
        public string Email_2 { get; set; }
        public string Phone_Number_2 { get; set; }
    
        public virtual Contact_Type Contact_Type { get; set; }
        public virtual Dataset Dataset { get; set; }
    }
 

Вот модель контакта из моего приложения, которая отправляется в веб-Api:

 public class Contact
    {
        public int Contact_ID { get; set; }
        public int Dataset_ID { get; set; }
        public string Booth_UCID { get; set; }
        public string First_Name { get; set; }
        public string Last_Name { get; set; }
        public string Title_Role { get; set; }
        public int Contact_Type_ID { get; set; }
        public string Email { get; set; }
        public string Phone_Number { get; set; }
        public string Email_2 { get; set; }
        public string Phone_Number_2 { get; set; }
    }
 

И вот мое приложение MVC для редактирования контакта

  [HttpPost]
        public ActionResult EditContact(Contact contact)
        {
            using (var client = new HttpClient())
            {

                client.BaseAddress = new Uri("http://localhost:4251/");

                //HTTP POST
                // var postTask = client.PostAsJsonAsync<Dataset>("api/datasets/1", dataset);
                var postTask = client.PostAsJsonAsync("api/contacts/2", contact);
                postTask.Wait();

                var result = postTask.Resu<
                if (result.IsSuccessStatusCode)
                {
                    return RedirectToAction("Index");
                }
            }

            ModelState.AddModelError(string.Empty, "Server Error. Please contact administrator.");

            return View(contact);
        }
 

и, наконец, вот мой веб-Api со scafolding Entity Framework: это прямо из коробки, когда я создавал свой веб-Api

  // PUT: api/Contacts/5
        [ResponseType(typeof(void))]
        public async Task<IHttpActionResult> PutContact(int id, Contact contact)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != contact.Contact_ID)
            {
                return BadRequest();
            }

             
            

            db.Entry(contact).State = EntityState.Modified;

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ContactExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return StatusCode(HttpStatusCode.NoContent);
        }
 

Я в недоумении относительно того, что я мог бы сделать. Я чувствую, что должен просто отказаться от веб-Api с Entity Framework и просто создать пустой веб-Api, где я контролирую обновление. И если да, то как это будет отличаться?

Ответ №1:

*** Обновление *** Я исправил эту проблему и надеюсь, что это поможет другим. Моя проблема не была связана с веб-Api или Entity Framework. Моя проблема заключалась в запросе, который я отправлял в веб-Api.

Я хотел выполнить обновление (PUT), но когда я запустил это в debug, я заметил, что метод PUT в моем веб-Api не запускается. Я поставил точку останова в своем методе POST, и это было так. Итак, я провел небольшое исследование и понял, что мне нужно изменить запрос ниже:

эта строка добавляет СООБЩЕНИЕ, поэтому я дублировал свои записи в базе данных

 var postTask = client.PostAsJsonAsync("api/datasets/2", dataset);
 

Я изменил его на следующее, чтобы выполнить обновление:

 var postTask = client.PutAsJsonAsync<Dataset>("api/datasets/2", dataset);
 

Я думал, что uri, который я отправлял, будет диктовать, какой метод поместить или опубликовать.