在ASP.NET MVC数据库使用GUID作为ID(Using a GUID as the ID i

2019-08-01 18:34发布

我学习ASP.NET MVC。 我下面的基本教程之一asp.net 。 由于我不始终遵循教程来的信,我决定使用GUID作为标识列,而不是一个整数。 一切工作正常,直到我起身到通过MVC应用程序添加新记录到数据库的点。 当我添加了新的记录,它插入,而不是产生一个空白的GUID。 这里是处理插入代码隐藏的部分:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = "id")]Movie movieToCreate)
{
    try
    {
        _entities.AddToMovieSet(movieToCreate);
        _entities.SaveChanges();

        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

[Bind(Exclude = "id")] “线忽略”的ID列,因为它是自动生成。 在本教程中,ID是自动递增,但我认为这是因为它是一个整数。 我尝试添加一条线,此方法:

[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();
    }
}

但ID仍然是一个空的GUID。 任何人都可以向我提供有关这是为什么,也许如何解决它的一些信息?

Answer 1:

你可以使用自定义ModelBinder的。 我了解那些在这里 。

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

而你的动作控制器将是:

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

而你也需要在Global.asax中注册的粘结剂:

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


Answer 2:

在.NET 3.5 SP1的SQL Server的EF提供商无法检索服务器生成的GUID,因为的SQL Server版本陈旧无法支持。 所以,你需要生成GUID的客户端,直到该限制是固定的。

可以在模型绑定做到这一点,因为swilliams建议,但恕我直言粘合剂只应在请求数据绑定。 所以,我做我的模型层。 但无论哪种方式会工作。



Answer 3:

什么是ID字段的SQL数据库类型? 它是唯一标识符? 如果不是,将其更改为唯一标识符,使之自动生成。 看看这个文章。



Answer 4:

你还可更新您获得创建操作如下,并赋予它新的GUID,在这一点上。 然后,它会自动转移到后行动。 在所有的代码看起来像:

public ActionResult Create()
{
   Movie movietocreate = new Movie();

   movietocreate.id = Guid.NewGuid();  //you set the new guid here

   return View(movietocreate);   
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Movie movieToCreate)
{
    try
    {
        _entities.AddToMovieSet(movieToCreate);
        _entities.SaveChanges();

        return RedirectToAction("Index");
    }
    catch
    {
            return View();
    }
}


文章来源: Using a GUID as the ID in a database with ASP.NET MVC