我在实体框架中创建了数据库,并且还创建了一个使用实体框架的 Web API。当我执行 GET 或 POST(ADD)时,一切都很好,但是当我执行 PUT(更新)时,我的记录不会更新,它会被添加,就像我执行了 Post 一样。我认为以下内容无法识别实体已被修改:
db.Entry(contact).State = EntityState.Modified;
所以,这是我由实体框架创建的整个实体 Contact.cs:
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; }
}
这是我的应用程序中发送到 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; }
}
这是我用于编辑联系人的 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.Result;
if (result.IsSuccessStatusCode)
{
return RedirectToAction("Index");
}
}
ModelState.AddModelError(string.Empty, "Server Error. Please contact administrator.");
return View(contact);
}
最后,这是带有实体框架脚手架的 Web API:当我创建 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);
}
我不知道自己能做什么。我觉得我应该放弃带有实体框架的 Web API,然后继续构建一个由我控制更新的空 Web API。如果是这样,会有什么不同?
*** 更新*** 我解决了这个问题,希望这对其他人有帮助。 我的问题不在 Web Api 或实体框架内。我的问题出在我发送到 Web Api 的请求中。
我想做一个更新(PUT),但是当我在调试中运行它时,我注意到我的 Web Api 中的 PUT 方法没有被触发。我在 POST 方法上设置了一个断点,就是这样。所以,我做了一些研究,我意识到我需要更改以下请求:
此行执行 POST ADD,这就是我在数据库中复制记录的原因
var postTask = client.PostAsJsonAsync("api/datasets/2", dataset);
我将其更改为以下内容以进行更新:
var postTask = client.PutAsJsonAsync<Dataset>("api/datasets/2", dataset);
我认为我发送的 uri 将决定使用哪种方法 put 或 post。