Web API PUT嵌套ICollection

时间:2013-12-24 17:23:13

标签: asp.net asp.net-mvc entity-framework asp.net-web-api

如何使用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"
            }
        ]
    }
});

如何修改我的控制器代码以便组织保存?公司组织多与多。我想也许我可以删除与该公司关联的所有现有组织,然后保存所有新组织,但我对如何让这些新组织保存并与公司关联感到困惑。

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;