WebAPI在执行POST时创建子项重复

时间:2017-01-19 00:55:23

标签: angularjs entity-framework asp.net-web-api asp.net-web-api2

尝试在我的网络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);
}

1 个答案:

答案 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;
    }