我正在学习ASP.NET MVC。我正在关注asp.net上的一个基本教程。由于我并不总是遵循教程,所以我决定使用GUID作为标识列而不是整数。一切正常,直到我通过MVC应用程序向数据库添加新记录。当我添加新记录时,它插入了一个空白GUID而不是生成的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。任何人都可以向我提供一些有关为什么会这样做以及如何解决它的信息吗?
答案 0 :(得分:6)
您可以使用自定义ModelBinder。我了解了那些超过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;
}
}
你的行动控制器将是:
[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());
}
答案 1 :(得分:1)
.NET 3.5 SP1中的SQL Server EF提供程序无法检索服务器生成的GUID,因为SQL Server的旧版本无法支持该提供程序。因此,您需要生成GUID客户端,直到修复此限制。
你可以在模型绑定器中执行此操作,如swilliams建议的那样,但IMHO绑定器应该只绑定请求中的数据。所以我在我的模型层上做。但无论哪种方式都有效。
答案 2 :(得分:1)
SQL数据库中ID字段的类型是什么?它是uniqueidentifier吗? 如果没有,请将其更改为uniqueidentifier并使其自动生成。 查看this文章。
答案 3 :(得分:0)
您也可以按照以下步骤更新您的获取创建操作,并在此时为其提供新的指导。然后它会自动转移到后期操作。所有代码看起来都是这样的:
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();
}
}