Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在JSON Post的Web Api中正确配置方法?_C#_Json_Asp.net Core_Asp.net Core Webapi - Fatal编程技术网

C# 如何在JSON Post的Web Api中正确配置方法?

C# 如何在JSON Post的Web Api中正确配置方法?,c#,json,asp.net-core,asp.net-core-webapi,C#,Json,Asp.net Core,Asp.net Core Webapi,我需要将数据更新/保存到数据库,但遇到了一个问题: 在Postman中测试时,我检查了以下JSON: { "contactId": "1", "contactName": "t4jnesfdv", "company": { "companyName":"a546fghf" } } { "contactId": "1", "contactName": "t4jnesfdv", "company": { "companyId":"2", "co

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

{
"contactId": "1",
"contactName": "t4jnesfdv",
"company": {
  "companyName":"a546fghf"
   }
}
{
"contactId": "1",
"contactName": "t4jnesfdv",
"company": {
           "companyId":"2",
           "companyName":"a546fghf"
      }
}
{
        "contactId": 2,
        "contactName": "1try93445",
        "companyId": "7"
    }
它更新/保存表联系人中选定的记录,但也向其他表公司添加新记录

在Postman中测试时,我检查了以下JSON:

{
"contactId": "1",
"contactName": "t4jnesfdv",
"company": {
  "companyName":"a546fghf"
   }
}
{
"contactId": "1",
"contactName": "t4jnesfdv",
"company": {
           "companyId":"2",
           "companyName":"a546fghf"
      }
}
{
        "contactId": 2,
        "contactName": "1try93445",
        "companyId": "7"
    }
获取500个内部服务器错误

接口

public interface IContactService
{
    Task<bool> SaveContact(ContactModel contact);
}
公共接口IContactService
{
任务保存联系人(联系人模型联系人);
}
服务

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;
    }
}
公共异步任务保存联系人(ContactModel ContactModel)
{
使用(ContactDBContext db=new ContactDBContext())
{
Contacts contact=db.Contacts.Where
(x=>x.ContactId==contactModel.ContactId).FirstOrDefault();
if(contact==null)
{
联系人=新联系人()
{
ContactName=contactModel.ContactName,
Company=contactModel.Company
};
db.Contacts.Add(contact);
}
其他的
{
contact.ContactName=contactModel.ContactName;
contact.Company=contactModel.Company;
}
return wait db.saveChangesSync()>=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));
    }
}
[路由(“api/[控制器]”)]
公共类ContactController:控制器
{
[HttpPost]
[路由(“保存联系人”)]
公共异步任务SaveContact([FromBody]ContactModel)
{
返回Ok(等待contactService.SaveContact(型号));
}
}
模型

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 int CompanyId{get;set;}
公共字符串CompanyName{get;set;}
公共ICollection联系人{get;set;}
}
公共类模型
{
public int ContactId{get;set;}
公共字符串ContactName{get;set;}
上市公司{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; }
    }
上市公司
{
public int CompanyId{get;set;}
[长度(150)]
公共字符串CompanyName{get;set;}
公共ICollection联系人{get;set;}
}
公共类联系人
{
[关键]
public int ContactId{get;set;}
公共字符串ContactName{get;set;}
上市公司{get;set;}
}

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

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

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;
试试这个

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;
        }
    }
公共异步任务保存联系人(ContactModel ContactModel)
{
使用(ContactDBContext db=new ContactDBContext())
{
Contacts contact=db.Contacts.Where
(x=>x.ContactId==contactModel.ContactId).FirstOrDefault();
if(contact==null)
{
联系人=新联系人()
{
ContactName=contactModel.ContactName,
Company=contactModel.Company
};
db.Contacts.Add(contact);
}
其他的
{
contact.ContactName=contactModel.ContactName;
contact.Company.CompanyId=contactModel.Company.CompanyId;
}
return wait db.saveChangesSync()>=1;
}
}

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

重写服务:

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;
            }
        }

所有人都正常工作。

我在桌上联系人和公司之间有着一对多的关系
modelBuilder.Entity().有许多(c=>c.Contacts),其中一个(e=>e.Company)确定然后你必须迭代一个循环并分配每个值,然后你可以直接调用savechanges()方法,因为我可以看到你将company作为基本对象,contact作为company的子对象,所以一个company可以有多个contact,所以首先更正你的json对象,创建公司作为对象,并在公司中创建联系人数组。您想更新联系人的单个对象还是多个对象?我想更新数据库中的表联系人(我有字段ContactId、ContactName和CompanyId),并更改其中的字段CompanyId
{“ContactId”:“2”,“ContactName”:“23424”,“company”:{“CompanyId”:1}
你能发布你的
ContactModel
类吗?如果你在应用程序中设置了一个断点,错误发生在哪里,那么终点是否真的被击中了?你的型号似乎和我们的很相配JSON@Michael我得到了这个SqlException:当identity\u insert设置为OFF时,无法在表“Company”中为identity列插入显式值。发送请求时出现500错误?是否在Startup.cs中注册了
IContactService
?是否存在ID为2的公司?问题是Entity Framework试图添加公司记录,但如果启用IDENTITY_INSERT,则无法传递ID,因为这些值在数据库中会自动递增。我已经尝试过,但出现500个内部服务器错误