尝试在我的网络API上使用POST时遇到了一些问题。
当我创建新的Parent
并希望附加已存在的Child
时,我最终会使用Parent
并附加一个新创建的Child
实例,而不是我想要附上。我希望它足够清楚,否则我会更好地解释。
我正在使用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; }
}
这是添加调用web api的角度函数:
$scope.AddParent = function () {
if ($scope.Name != null) {
var parentData = {
Name: $scope.Name,
Children: $scope.childrenToAdd
}
console.log(parentData);
$http.post("/api/bundles/PostParent", parentData)
.then(function (data) {
$location.path("/index");
}, function (data) {
console.log(data);
})
}
}
Web api控制器中的POST,只是默认的脚手架。
[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);
}
答案 0 :(得分:0)
正如Jasen在评论中指出的那样,我看了一下这个问题
Entity Framework: adding existing child POCO to new Parent POCO, creates new child in DB
并使用在那里解释的第一种方法解决了这个问题。
我添加了一项检查,看看Children
集合是否包含任何实体,如果它已经更改了EntityState
。
这是我放入PostParent()
if (parent.Children.Count != 0)
{
foreach (Child child in parent.Children)
{
db.Entry(child).State = EntityState.Unchanged;
}