微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我使用 Entity Framework 6 的 Web Api PUT 不断写入新的重复记录而不是更新它们?

如何解决为什么我使用 Entity Framework 6 的 Web Api PUT 不断写入新的重复记录而不是更新它们?

我在 Entity Framework 中创建了我的数据库,并且我还创建了一个使用 Entity Framework 的 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 的方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?