I have this two objects – Magazine and Author (M-M relationship):
public partial class MAGAZINE
{
public MAGAZINE()
{
this.AUTHORs = new HashSet<AUTHOR>();
}
public long REF_ID { get; set; }
public string NOTES { get; set; }
public string TITLE { get; set; }
public virtual REFERENCE REFERENCE { get; set; }
public virtual ICollection<AUTHOR> AUTHORs { get; set; }
}
public partial class AUTHOR
{
public AUTHOR()
{
this.MAGAZINEs = new HashSet<MAGAZINE>();
}
public long AUTHOR_ID { get; set; }
public string FULL_NAME { get; set; }
public virtual ICollection<MAGAZINE> MAGAZINEs { get; set; }
}
}
My problem is that I can’t seem to update the number of authors against a magazine e.g. if I have 1 author called “Smith, P.” stored already against a magazine, I can add another called “Jones, D.”, but after the post back to the Edit controller the number of authors still shows 1 – i.e. “Smith, P.H”.
Please not that I have successfully model bound the number of authors back to the parent entity (Magazine), it uses a custom model binder to retrieve the authors and bind to the Magazine (I think), but it still doesn’t seem to update properly.
My code for updating the model is straight forward – and shows the variable values both before and after:
public ActionResult Edit(long id)
{
MAGAZINE magazine = db.MAGAZINEs.Find(id);
return View(magazine);
}
and here are the variables pre-editing/updating –

[HttpPost]
public ActionResult Edit(MAGAZINE magazine)
{
if (ModelState.IsValid)
{
db.Entry(magazine).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(magazine);
}
…and here are the variables after a new author has been added…
I am getting suspicious that the author entity is showing, post edit that it is not bound to any magazine and I am guessing this is why it is not being updated back to the magazine entity – but it is perplexing as I am effectively dealing with the same magazine entity – I guess it may be something to do with the custom model binder for the author.
Can anyone help on this matter?
For completeness – I have included my AuthorModelBinder class too –
public class AuthorModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var values = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (values != null)
{
// We have specified asterisk (*) as a token delimiter. So
// the ids will be separated by *. For example "2*3*5"
var ids = values.AttemptedValue.Split('*');
List<int> validIds = new List<int>();
foreach (string id in ids)
{
int successInt;
if (int.TryParse(id, out successInt))
{
validIds.Add(successInt);
}
else
{
//Make a new author
AUTHOR author = new AUTHOR();
author.FULL_NAME = id.Replace("\'", "").Trim();
using (RefmanEntities db = new RefmanEntities())
{
db.AUTHORs.Add(author);
db.SaveChanges();
validIds.Add((int)author.AUTHOR_ID);
}
}
}
//Now that we have the selected ids we could fetch the corresponding
//authors from our datasource
var authors = AuthorController.GetAllAuthors().Where(x => validIds.Contains((int)x.Key)).Select(x => new AUTHOR
{
AUTHOR_ID = x.Key,
FULL_NAME = x.Value
}).ToList();
return authors;
}
return Enumerable.Empty<AUTHOR>();
}
}

I faced a very similar scenario when I developed my blog using MVC/Nhibernate and the entities are
PostandTag.I too had an edit action something like this,
But unlike you I’ve created a custom model binder for the
PostnotTag. In the customPostModelBinderI’m doing pretty much samething what you are doing there (but I’m not creating newTags as you are doing forAuthors). Basically I created a newPostinstance populating all it’s properties from the POSTed form and getting all theTags for the ids from the database. Note that, I only fetched theTags from the database not thePost.I may suggest you to create a
ModelBinderfor theMagazineand check it out. Also it’s better to use repository pattern instead of directly making the calls from controllers.UPDATE:
Here is the complete source code of the
Postmodel binder