如何使用ASP.Net Web API 2设置嵌套ICollection?我会解释一下。
我正在使用带有Web API的实体框架2.我有一个公司如下:
public class Company
{
public int ID { get; set; }
[Required]
public string Name { get; set; }
..
public virtual CountryRegion CountryRegion { get; set; }
public virtual ICollection<Organization> Organizations { get; set; }
}
我有基于公司模型的标准生成的Web API 2控制器。这是我的PUT功能:
// PUT api/Company/5
public IHttpActionResult PutCompany(int id, Company company)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != company.ID)
{
return BadRequest();
}
var entityToUpdate = db.Companies.Find(id);
db.Entry<Company>(entityToUpdate).CurrentValues.SetValues(company);
db.Entry<Company>(entityToUpdate).State = EntityState.Modified;
db.Entry<CountryRegion>(entityToUpdate.CountryRegion).CurrentValues.SetValues(company.CountryRegion);
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!CompanyExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
由于默认生成的PUT函数中的db.Entry(company).State = EntityState.Modified;
不起作用,我已经将其替换为如上所述on another question所讨论的那样。
当我发送PUT调用时,如以下名称和CountryRegion保存但不是组织。
$.ajax({
type: "PUT",
url: "/api/company/2",
data: {
ID:2,
Name: "Test Company",
CountryRegion: {
ID: 2,
Name: "United States"
},
Organizations: [
{
ID: 10,
Name: "Test Org"
},
{
ID: 22,
Name: "Test Org 2"
}
]
}
});
如何修改我的控制器代码以便组织保存?公司组织多与多。我想也许我可以删除与该公司关联的所有现有组织,然后保存所有新组织,但我对如何让这些新组织保存并与公司关联感到困惑。
答案 0 :(得分:0)
只是在黑暗中拍摄,但你的FK是否在DB中正确设置?我多年没有使用Entity Framework,但是相关对象没有保存声音,就像它可能是该级别的问题,而不是你的Web API。
另外,为什么没有:
db.Entry<CountryRegion>(entityToUpdate.Organizations ).CurrentValues.SetValues(company.Organizations);
答案 1 :(得分:0)
我能够使用try
块上方的以下内容来解决这个问题,但我并不一定相信这是正确的方法:
//remove current organizations
foreach (var organization in db.Organizations)
{
entityToUpdate.Organizations.Remove(organization);
}
//add updated organizations
entityToUpdate.Organizations = company.Organizations;