#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, который я отправлял, будет диктовать, какой метод поместить или опубликовать.