Entity Framework Update Entity along with child entities (add/update as necessary)

后端 未结 3 1481
一个人的身影
一个人的身影 2021-02-02 15:24

I have a many-to-many relationship between Issues and Scopes in my EF Context. In ASP.NET MVC, I bring up an Edit form that allows the user to edit a

3条回答
  •  醉话见心
    2021-02-02 16:16

    Stubs are generally only effective for 1-* relationships. *-* relationships introduce a different set of challenges.

    Namely that when you attach both ends - unlike 1-* - you still have no idea if the relationship already exists or not.

    So that means that this code:

    if (issue.Scopes.Contains(thisScope))
    

    Is probably going to return false every time.

    What I would do is this:

    edmx.Issues.Attach(issue);
    UpdateModel(issue);
    // or ctx.LoadProperty(issue, "Scopes") if it is a POCO class.
    issue.Scopes.Load(); // hit the database to load the current state.
    

    Now you need to find out what you need to add & remove from issue.Scopes. You can do this by comparing based on ID.

    i.e. if you have a set of Scope IDs you want to have related to the issue (relatedScopes)

    Then this code works out what to add and what to remove.

    int[] toAdd = relatedScopes.Except(issue.Scopes.Select(s => s.ID)).ToArray();
    int[] toRemove = issue.Scopes.Select(s => s.ID).Except(relatedScopes).ToArray();
    

    Now for toAdd you do this:

    foreach(int id in toAdd)
    {
       var scope = new Scope{Id = id};
       edmx.Scopes.Attach(scope);
       issue.Scopes.Add(scope);
    }
    

    And for each scope you need to remove

    foreach(int id in toRemove)
    {
       issue.Scopes.Remove(issue.Scopes.Single(s => s.ID == id));
    }
    

    By now the correct relationships should be formed.

    Hope this helps

    Alex

    Microsoft

提交回复
热议问题