Using a GUID as the ID in a database with ASP.NET MVC

asp.net-mvc, guid

Solution

You could use a custom ModelBinder. I learned about those over here.

public class MyClassBinder : DefaultModelBinder {
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) {
        var model = (Movie)base.CreateModel(controllerContext, bindingContext, modelType);
        model.id = Guid.NewGuid();
        return model;
    }
}

And your action controller would be:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult MyAction(Movie movieToCreate) {
    // movie should have a new guid in the id
    _entities.AddToMovieSet(movieToCreate);
    _entities.SaveChanges();
}

And you would need to register the binder in Global.asax:

protected void Application_Start() {
    RegisterRoutes(RouteTable.Routes);
    ModelBinders.Binders.Add(typeof(Movie), new MyClassBinder());
}

Problem

I am learning ASP.NET MVC. I am following one of the basic tutorials on asp.net. Since I do not always follow the tutorials to the letter, I decided to use a GUID as the identity column instead of an integer. Everything was working fine until I got up to the point of adding a new record to the database through the MVC application. When I added the new record, it inserted a blank GUID instead of a generated one. Here is the segment of code-behind that handles the insertion: ``` [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create([Bind(Exclude = "id")]Movie movieToCreate) { try { _entities.AddToMovieSet(movieToCreate); _entities.SaveChanges(); return RedirectToAction("Index"); } catch { return View(); } } ``` The `[Bind(Exclude = "id")]` line 'ignores' the ID column, since it is autogenerated. In the tutorial, the ID is auto-incremented but I think that is because it is an integer. I tried adding a line to this method: ``` [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create([Bind(Exclude = "id")]Movie movieToCreate) { try { movieToCreate.id = Guid.NewGuid(); _entities.AddToMovieSet(movieToCreate); _entities.SaveChanges(); return RedirectToAction("Index"); } catch { return View(); } } ``` But the id is still an empty GUID. Can anyone provide me with some information on why this is and perhaps how to resolve it?

Original source

Related problems