2013-07-29 4 views
0

Я шел через ранние этапы урока на YouTube http://www.youtube.com/watch?v=WwmUFTWEh6YASP MVC Блог База данных не создает идентификационный номер

public ActionResult Update(int? id, string title, string body, DateTime dateTime, string tags) 
{ 
    if (!IsAdmin) 
    { 
     return RedirectToAction("Index"); 
    } 

    Post post = GetPost(id); 
    post.Title = title; 
    post.Body = body; 
    post.DateTime = dateTime; 
    post.Tags.Clear(); 

    tags = tags ?? string.Empty; 
    string[] tagNames = tags.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
    foreach (string tagName in tagNames) 
    { 
     post.Tags.Add(GetTag(tagName)); 
    } 

    if (!id.HasValue) 
    { 
     model.AddToPosts(post); 
    } 
    model.SaveChanges(); 
    return RedirectToAction("Details", new { id = post.ID }); 
} 

public ActionResult Edit(int? id) 
{ 
    Post post = GetPost(id); 
    StringBuilder tagList = new StringBuilder(); 
    foreach (Tag tag in post.Tags) 
    { 
     tagList.AppendFormat("{0} ", tag.Name); 
    } 
    ViewBag.Tags = tagList.ToString(); 
    return View(post); 
} 


private Tag GetTag(string tagName) 
{ 
    return model.Tags.Where(x => x.Name == tagName).FirstOrDefault() ?? new Tag() { Name = tagName }; 
} 

private Post GetPost(int? id) 
{ 
    return id.HasValue ? model.Posts.Where(x => x.ID == id).First() : new Post() { ID = -1 }; 
} 

Я получаю сообщение об ошибке ASPX «Невозможно вставить явное значение для столбца идентификаторов в таблице«сообщений ', когда для параметра IDENTITY_INSERT установлено значение OFF. " Я знаю, это потому, что он пытается вставить идентификатор -1, когда база данных обновляется, и я этого не хочу. Должен ли он просто создать новый идентификатор, если im пройдет в -1? Вот что происходит в учебнике. Я не знаю, почему моя действует по-другому.

==================================================================================================================================== ============== EDIT База данных была создана с использованием конструктора баз данных не через код, я просмотрел код, хотя и не вижу никакого объекта Autogenerated property или IsDbGenerated, где на земле я бы вставить это?

// <summary> 
/// No Metadata Documentation available. 
/// </summary> 
[EdmEntityTypeAttribute(NamespaceName="CollateralSystems.Models", Name="Post")] 
[Serializable()] 
[DataContractAttribute(IsReference=true)] 
public partial class Post : EntityObject 
{ 
    #region Factory Method 

    /// <summary> 
    /// Create a new Post object. 
    /// </summary> 
    /// <param name="id">Initial value of the ID property.</param> 
    /// <param name="title">Initial value of the Title property.</param> 
    /// <param name="dateTime">Initial value of the DateTime property.</param> 
    /// <param name="body">Initial value of the Body property.</param> 
    public static Post CreatePost(global::System.Int32 id, global::System.String title, global::System.DateTime dateTime, global::System.String body) 
    { 
     Post post = new Post(); 

     post.ID = id; 
     post.Title = title; 
     post.DateTime = dateTime; 
     post.Body = body; 
     return post; 
    } 

    #endregion 
    #region Primitive Properties 

    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    /// 

    [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] 
    [DataMemberAttribute()] 
    public global::System.Int32 ID 
    { 
     get 
     { 
      return _ID; 
     } 
     set 
     { 
      if (_ID != value) 
      { 
       OnIDChanging(value); 
       ReportPropertyChanging("ID"); 
       _ID = StructuralObject.SetValidValue(value); 
       ReportPropertyChanged("ID"); 
       OnIDChanged(); 
      } 
     } 
    } 
    private global::System.Int32 _ID; 
    partial void OnIDChanging(global::System.Int32 value); 
    partial void OnIDChanged(); 
+0

Что вы используете для запросов БД? Entity Framework? – Andrei

+0

Возможно, учебник использует '[DatabaseGenerated (DatabaseGeneratedOption.Identity)]' значение ID. – anaximander

+0

@anaximander, наоборот - DB имеет автоинкрементный столбец, в то время как EF ничего не знает об этом и генерирует код для вставки ID – Andrei

ответ

0

Скорее всего в столбце базы данных ID (или аналогичный) в таблице Posts была создана как авто генерируемый столбец - это Db отвечает за значение для этого столбца всякий раз, когда новая запись вставляется в таблицу. Вследствие этого явная вставка значений для этого столбца запрещена (не совсем верно, она по-прежнему возможна, но не обязательно здесь).

Однако система ORM, которую вы используете, ничего не знает об этой специфике столбца, поэтому, когда она получает команду для вставки нового объекта Posts в базу данных, она генерирует SQL для вставки каждого свойства, которое было сопоставлено с столбцом, включая Я БЫ. Конечно, этот SQL терпит неудачу, поскольку вставить значения ID, которые он запретил в БД.

Для решения этой проблемы вы должны установить ORM правильно. Если вы используете EF или LINQ to SQL - проверьте контекст БД и, в частности, свойства Posts.ID. Скорее всего его свойство AutoGenerated установлено в false, что неверно. Установите значение true, и ваша вставка будет работать, как ожидалось.

В качестве альтернативы вы можете перейти к сгенерированной DataContext класса, найти класс Posts там и убедитесь, что его свойство ID имеет атрибут IsDbGenerated.

+0

Я забыл «Обновить модель из базы данных» после установки поля идентификации. Так глупо, и я трачу ваше время жаль – JMG

Смежные вопросы