我学习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。 任何人都可以向我提供有关这是为什么,也许如何解决它的一些信息?
你可以使用自定义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());
}
在.NET 3.5 SP1的SQL Server的EF提供商无法检索服务器生成的GUID,因为的SQL Server版本陈旧无法支持。 所以,你需要生成GUID的客户端,直到该限制是固定的。
您可以在模型绑定做到这一点,因为swilliams建议,但恕我直言粘合剂只应在请求数据绑定。 所以,我做我的模型层。 但无论哪种方式会工作。
什么是ID字段的SQL数据库类型? 它是唯一标识符? 如果不是,将其更改为唯一标识符,使之自动生成。 看看这个文章。
你还可更新您获得创建操作如下,并赋予它新的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();
}
}