vendredi 26 février 2021

Why does my Web Api PUT using Entity Framework 6 keep writing new duplicate records rather than updating them?

I created my database in Entity Framework, and I also created a Web Api that uses Entity Framework. When I perform a GET or a POST (ADD) everything works great, but When I do a PUT (Update) my record is not updated, it is added as if I performed a Post. I think that the following does not recognize that the Entity has been modified:

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

So, here is my entire Entity Contact.cs created by 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; }
    }

Here is the Contact model from my application that is being sent to the Web 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; }
    }

And here is my MVC Application to Edit Contact

 [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.Result;
                if (result.IsSuccessStatusCode)
                {
                    return RedirectToAction("Index");
                }
            }

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

            return View(contact);
        }

and lastly, here is my Web Api with the Entity Framework scafolding: this is straight out of the box, when I created my Web 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);
        }

I am at a loss as to what I could possible do. I feel like I should just abandon the Web Api with Entity Framework and just go ahead build an Empty Web Api where I control the update. And if so, how will this be different?




Aucun commentaire:

Enregistrer un commentaire