【问题标题】:How to properly configure method in Web Api for JSON Post?如何在 Web Api 中为 JSON Post 正确配置方法?
【发布时间】:2019-09-23 21:50:53
【问题描述】:

我需要更新/保存数据到数据库,但遇到了一个问题: 在 Postman 中进行测试时,我检查了这个 JSON:

{
"contactId": "1",
"contactName": "t4jnesfdv",
"company": {
  "companyName":"a546fghf"
   }
}

它更新/保存表联系人中的选定记录,但也将新记录添加到其他表公司。

在 Postman 中进行测试时,我检查了这个 JSON:

{
"contactId": "1",
"contactName": "t4jnesfdv",
"company": {
           "companyId":"2",
           "companyName":"a546fghf"
      }
}

获取 500 内部服务器错误。

界面

public interface IContactService
{
    Task<bool> SaveContact(ContactModel contact);
}

服务

public async Task<bool> SaveContact(ContactModel contactModel)
{
    using (ContactDBContext db = new ContactDBContext())
    {
        Contacts contact = db.Contacts.Where
                 (x => x.ContactId == contactModel.ContactId).FirstOrDefault();
        if (contact == null)
        {

            contact = new Contacts()
            {
                ContactName = contactModel.ContactName,
                Company = contactModel.Company
            };
            db.Contacts.Add(contact);

        }
        else
        {
            contact.ContactName = contactModel.ContactName;
            contact.Company = contactModel.Company;
        }

        return await db.SaveChangesAsync() >= 1;
    }
}

控制器

[Route("api/[controller]")]
public class ContactController : Controller
{
    [HttpPost]
    [Route("SaveContact")]
    public async Task<IActionResult> SaveContact([FromBody] ContactModel model)
    {
        return Ok(await _contactService.SaveContact(model));
    }
}

型号

public class CompanyModel
    {
        public int CompanyId { get; set; }
        public string CompanyName { get; set; }
        public ICollection<Contacts> Contacts { get; set; }
    }
public class ContactModel
    {
        public int ContactId { get; set; }
        public string ContactName { get; set; }
        public Company Company { get; set; }
    }

实体

public class Company
    {
        public int CompanyId { get; set; }
        [StringLength(150)]
        public string CompanyName { get; set; }
        public ICollection<Contacts> Contacts { get; set; }
    }
public class Contacts
    {
        [Key]
        public int ContactId { get; set; }
        public string ContactName { get; set; }
        public Company Company { get; set; }
    }

我希望保存/更新表中的记录与表公司中的现有公司联系,而不向表公司添加新记录

【问题讨论】:

  • 你能发布你的ContactModel课程吗?
  • 如果你在错误发生的应用程序中放置一个断点,终点真的会被命中吗?您的模型似乎与 JSON 匹配得很好
  • @Michael 我得到了这个 SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“公司”中插入标识列的显式值。
  • 您在发送请求时收到 500 错误?您是否在 Startup.cs 中注册了IContactService
  • 是否存在 ID 为 2 的公司?问题出在这里 Entity Framework 正在尝试添加公司记录,但使用 IDENTITY_INSERT 您无法传递 ID,因为这些值在数据库中自动递增

标签: c# json asp.net-core asp.net-core-webapi


【解决方案1】:

我认为 Company 是您数据库中的子表,因此在更新的情况下,您应该首先从数据库中获取该公司对象,然后使用其对象更新其值

Contacts contact = db.Contacts.Where(x => x.ContactId == contactModel.ContactId).FirstOrDefault();

Company company = db.Companies.Where(x => x.ContactId == contactModel.ContactId).FirstOrDefault();

 contact.ContactName = contactModel.ContactName;
 contact.Company.CompanyName = contactModel.Company.CompanyName;

【讨论】:

  • 我在表联系人和公司之间有一对多的关系。 modelBuilder.Entity&lt;Company&gt;() .HasMany(c =&gt; c.Contacts) .WithOne(e =&gt; e.Company);
  • OK 然后你必须遍历一个循环并分配每个值,然后你可以直接调用 savechanges() 方法
  • 我可以看到您将公司作为基础对象,将联系人作为公司的子对象,因此一个公司可以有多个联系人,因此首先更正您的 json 对象,将公司创建为对象并创建数组公司联系人。
  • 您要更新单个联系人对象还是多个对象?
  • 我想在我的数据库中更新表联系人(我有字段 ContactId、ContactName 和 CompanyId)并在此处更改字段 CompanyId { "contactId": "2", "contactName": "23424", "company": { "companyId": 1 } }
【解决方案2】:

试试这个

public async Task<bool> SaveContact(ContactModel contactModel)
    {
        using (ContactDBContext db = new ContactDBContext())
        {
            Contacts contact = db.Contacts.Where
                     (x => x.ContactId == contactModel.ContactId).FirstOrDefault();
            if (contact == null)
            {

                contact = new Contacts()
                {
                    ContactName = contactModel.ContactName,
                    Company = contactModel.Company
                };
                db.Contacts.Add(contact);

            }
            else
            {
                contact.ContactName = contactModel.ContactName;
                contact.Company.CompanyId = contactModel.Company.CompanyId;
            }

            return await db.SaveChangesAsync() >= 1;
        }
    }

【讨论】:

  • 我已经试过了,但是得到 500 Internal Server Error
【解决方案3】:

我重写了我的联系实体和模型(并更新了数据库):

public class Contacts
    {
        [Key]
        public int ContactId { get; set; }
        public string ContactName { get; set; }
        [Display(Name = "Company")]
        public int? CompanyId { get; set; }
        [ForeignKey("CompanyId")]
        public Company Companies { get; set; }
    }

重写服务:

public async Task<bool> SaveContact(ContactModel contactModel)
        {
            using (ContactDBContext db = new ContactDBContext())
            {
                Contacts contact = db.Contacts.Where
                         (x => x.ContactId == contactModel.ContactId).FirstOrDefault();
                if (contact == null)
                {
                        contact = new Contacts()
                    {
                        ContactName = contactModel.ContactName,
                        CompanyId = contactModel.CompanyId
                };
                    db.Contacts.Add(contact);
                    }
                else
                {
                    contact.ContactName = contactModel.ContactName;
                    contact.CompanyId = contactModel.CompanyId;
                }

                return await db.SaveChangesAsync() >= 1;
            }
        }

并使用此 JSON 在 Postman 中测试了我的 Web Api:

{
        "contactId": 2,
        "contactName": "1try93445",
        "companyId": "7"
    }

一切正常。

【讨论】:

    猜你喜欢
    • 2015-08-12
    • 2011-09-11
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2015-08-07
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多