C# 如何在JSON Post的Web Api中正确配置方法?
我需要将数据更新/保存到数据库,但遇到了一个问题: 在Postman中测试时,我检查了以下JSON: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
{
"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个内部服务器错误