Angularjs WebAPI在执行POST时创建子项的副本

Angularjs WebAPI在执行POST时创建子项的副本,angularjs,entity-framework,asp.net-web-api,asp.net-web-api2,Angularjs,Entity Framework,Asp.net Web Api,Asp.net Web Api2,我在尝试使用带有web api的帖子时遇到了一些问题。 当我创建一个新的父对象并希望附加一个已经存在的子对象时,我最终附加了父对象和一个新创建的子对象实例,而不是我想要附加的实例。我希望它足够清楚,否则我会解释得更好 我使用的是codefirst EEF web api 2设置,这是一个非常基本的AngularJs前端 我应该补充一点,我对web api和angularJS都是相当新的 这是我的两个模型: public class Parent { public int Id { get

我在尝试使用带有web api的帖子时遇到了一些问题。 当我创建一个新的
父对象
并希望附加一个已经存在的
子对象
时,我最终附加了
父对象
和一个新创建的
子对象
实例,而不是我想要附加的实例。我希望它足够清楚,否则我会解释得更好

我使用的是codefirst EEF web api 2设置,这是一个非常基本的AngularJs前端

我应该补充一点,我对web api和angularJS都是相当新的

这是我的两个模型:

public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<Children> Child { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }

    public int ParentId { get; set; }
    public virtual Parent { get; set; }
}
还有WebAPI控制器中的帖子,只是默认的框架式帖子

[ResponseType(typeof(Parent))]
public IHttpActionResult PostParent(Parent parent)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    db.Parent.Add(parent);
    db.SaveChanges();

    return CreatedAtRoute("DefaultApi", new { id = parent.Id }, parent);
}

正如Jasen在评论中指出的那样,我对这个问题进行了研究

通过使用第一种方法,我解决了这个问题

我添加了一个检查,以查看
子项
集合是否包含任何实体(如果有),我更改了它们的
实体状态

这就是我在我的
PostParent()


看到这个了吗?谢谢@Jasen,使用这里介绍的第一种方法,将状态设置为unchanged,就完美地解决了这个问题
[ResponseType(typeof(Parent))]
public IHttpActionResult PostParent(Parent parent)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    db.Parent.Add(parent);
    db.SaveChanges();

    return CreatedAtRoute("DefaultApi", new { id = parent.Id }, parent);
}
if (parent.Children.Count != 0)
{
    foreach (Child child in parent.Children)
    {
        db.Entry(child).State = EntityState.Unchanged;
    }