Использование GUID в качестве идентификатора в базе данных с ASP.NET MVC

Я изучаю 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")] линия 'игнорирует столбец идентификатора, поскольку он генерируется автоматически. В учебнике идентификатор увеличивается автоматически, но я думаю, что это потому, что это целое число. Я попытался добавить строку к этому методу:

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

Но идентификатор все еще пустой GUID. Может кто-нибудь предоставить мне некоторую информацию о том, почему это и, возможно, как решить эту проблему?

 Craig Stuntz20 авг. 2009 г., 03:57
Оба значения генерируются на сервере. Но EF видит только int, потому что поставщик SQL Server возвращает сгенерированные целые с сервера, но не сгенерированные идентификаторы. Если вы удалили контекст и запросили, вы 'буду видеть оба.
 Craig Stuntz20 авг. 2009 г., 03:58
... но не сгенерированные идентификаторы. -> ... но не сгенерированные GUID.
 Anders19 авг. 2009 г., 21:58
Видимо удаляя[Bind(Exclude)] и сохраняяGuid.NewGuid() исправляет эту проблему. Я все еще хотел бы знать, почему идентификатор автоматически увеличивается, но GUID не генерируется автоматически.

Ответы на вопрос(4)

фикатор? Если нет, измените его на uniqueidentifier и сделайте его автоматически созданным. Проверять, выписыватьсяэтот статья.

 Sorantis19 авг. 2009 г., 23:50
Ой ... Мой плохой ..
 Craig Stuntz19 авг. 2009 г., 23:08
Он уже сделал это; внимательно прочитайте вопрос. Поставщик SQL Server для EF выигралt перенаправить автоматически сгенерированные 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());
}
 Anders19 авг. 2009 г., 22:24
Буду ли я создавать этот переплет внутри своего собственного файла? Если так, где это должно быть размещено? В том же каталоге, что и мои контроллеры? Спасибо за информацию и ссылку!
 swilliams19 авг. 2009 г., 23:36
Я обычно создаю папку Extensions в своем проекте и помещаю туда подобные вещи и расширения HtmlHelper.
 Anders19 авг. 2009 г., 23:01
Отлично, спасибо за это!
 Ben Robbins19 авг. 2009 г., 22:32
Я поместил свои пользовательские связыватели в папку с именем «Связыватели» в папке «Модели» моего приложения MVC.

ые сервером идентификаторы GUID, поскольку архаичные версии SQL Server не моглине могу поддержать это. Поэтому вам нужно генерировать GUID на стороне клиента, пока это ограничение не будет исправлено.

ВыМожно сделать это в связывателе модели, как предполагает swilliams, но связыватели IMHO должны связывать только данные в запросе. Так что я делаю это на своем уровне модели. Но в любом случае будет работать.

 Anders19 авг. 2009 г., 23:28
В общем, что я сделал, удалив [Bind (Execute)] из параметра Movie?
 Anders19 авг. 2009 г., 23:02
Не могли бы вы уточнить свой метод? Поскольку я учусь, я хотел бы знать все варианты, которые у меня есть. Спасибо!
 Craig Stuntz19 авг. 2009 г., 23:07
Просто, правда. Я устанавливаю идентификатор в коде (с помощью Guid.NewGuid ()) перед вызовом SaveChanges () при вставке новой записи. Все это делается внутри сборки модели, которая отделена от сборки, содержащей контроллеры и представления.

ь ему новое руководство. Затем он будет автоматически перенесен в действие post. Код all будет выглядеть так:

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

   movietocreate.id = Guid.NewGuid();  //yo,u 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();
    }
}

Ваш ответ на вопрос