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
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