Angularjs WebAPI在执行POST时创建子项的副本
我在尝试使用带有web api的帖子时遇到了一些问题。 当我创建一个新的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
父对象
并希望附加一个已经存在的子对象
时,我最终附加了父对象
和一个新创建的子对象
实例,而不是我想要附加的实例。我希望它足够清楚,否则我会解释得更好
我使用的是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;
}