Asp.Net MVC 4 - Добавление объектной модели в коллекцию ICollection внутри другой объектной модели

Некоторый фон

У меня есть 2 таблицы в моем первом приложении Asp.Net MVC 4 Database, подача и комментирование. (Их намного больше, но они не имеют отношения к этому вопросу). Любая данная Заявка может иметь любое количество комментариев (от одного до многих), связанных с ней.

У меня есть страница сведений о представлении, на которой пользователь может открыть диалоговое окно jQuery с частичным представлением внутри него, чтобы добавить комментарий к представлению. Это частичное представление связано со строго типизированной моделью представления, созданной для добавления комментариев.

Столы / Модели

Таблица подачи

Вот модель класса для таблицы представления. (Я упустил некоторые свойства для простоты).

Partial Public Class Submission
    Public Property Submission_ID As Integer
    Public Property Submission_Hash As String
    Public Property Created As Nullable(Of Date)
    Public Property Modified As Date

    Public Overridable Property Comments As ICollection(Of Comment) = New HashSet(Of Comment)
End Class

Таблица комментариев

А вот модель класса для таблицы комментариев. (Опять же, я упустил некоторые свойства для простоты).

Partial Public Class Comment
    Public Property Comment_ID As Integer
    Public Property User_ID As Nullable(Of Integer)
    Public Property Comment_Type As Nullable(Of Integer)
    Public Property Comment1 As String
    Public Property Created As Nullable(Of Date)
    Public Property Modified As Date

    Public Overridable Property Comment_Type1 As Comment_Type
    Public Overridable Property User As User
    Public Overridable Property Submissions As ICollection(Of Submission) = New HashSet(Of Submission)
End Class

Требование

То, что я пытаюсь сделать, это добавить новый комментарий к коллекции комментариев, которые уже существуют для данного представления.

До сих пор...

До сих пор у меня есть модель представления для диалогового окна добавления комментария, которое инициализируется в моем контроллере, а затем возвращает заполненную модель представления обратно в метод постов контроллеров. Вот код

ViewModel

Public Class SubmissionAddCommentViewModel

    <Display(Name:="Submission")> _
    Public Property Submission_ID As Integer

    <Display(Name:="User")> _
    Public Property User_ID As Integer

    <Display(Name:="Comment type")> _
    Public Property Comment_Type As Integer

    <Required(ErrorMessage:="Please enter a comment.")> _
    <Display(Name:="Comment")> _
    Public Property Comment As String

End Class

ViewModel Builder

Public Class SubmissionAddCommentViewModel_Builder

    Implements IModelBuilder(Of SubmissionAddCommentViewModel, Comment)
    ReadOnly db As GeosightEntities
    ReadOnly submission As Submission

    Public Sub New(db As GeosightEntities, submission As Submission)
        Me.db = db
        Me.submission = submission
    End Sub

    Public Function CreateFrom(entity As Comment) As SubmissionAddCommentViewModel Implements IModelBuilder(Of SubmissionAddCommentViewModel, Comment).CreateFrom
        Dim model = New SubmissionAddCommentViewModel()

        model.Submission_ID = submission.Submission_ID
        model.User_ID = GetLoggedIn_ID()

        Return model
    End Function

    Public Function Rebuild(model As SubmissionAddCommentViewModel) As SubmissionAddCommentViewModel Implements IModelBuilder(Of SubmissionAddCommentViewModel, Comment).Rebuild
        Return model
    End Function

    Public Sub Add(model As SubmissionAddCommentViewModel)
        Dim comment As New Comment

        ' Map the ViewModel and Model fields
        comment.Comment_Type1 = If(IsNothing(model.Comment_Type), Nothing, db.Comment_Type.Find(model.Comment_Type))
        comment.User = db.Users.Find(model.User_ID)
        comment.Comment1 = model.Comment
        comment.Modified = Now

        ' Add the comment
        db.Submissions.Find(model.Submission_ID).Comments.Add(comment)
        db.SaveChanges()
    End Sub

End Class

Метод получения контроллера

Function AddComment(Optional ByVal id As Integer = Nothing) As ActionResult

    Dim commentAddView As New SubmissionAddCommentViewModel
    Dim submission As Submission = db.Submissions.Find(id)
    Dim comment As New Comment

    If IsNothing(submission) Then
        Return HttpNotFound()
    End If

    Me.builder_AddComment = New SubmissionAddCommentViewModel_Builder(db, submission)

    ' Create the instance of the submission add comment view model
    commentAddView = builder_AddComment.CreateFrom(comment)

    If Request.IsAjaxRequest Then
        Return PartialView("AddCommentPartial", commentAddView)
    End If

    Return View(commentAddView)
End Function

Метод пост контроллера

<HttpPost()> _
Function AddComment(ByVal commentAddView As SubmissionAddCommentViewModel) As ActionResult

    Dim comment As New Comment
    builder_AddComment = New SubmissionAddCommentViewModel_Builder(db, db.Submissions.Find(commentAddView.Submission_ID))

    ' Handle invalid comment models
    If Not ModelState.IsValid Then

        If Request.IsAjaxRequest Then
            Return PartialView("AddCommentPartial", commentAddView)
        End If

        Return View(commentAddView)
    End If

    ' Add the comment
    Me.builder_AddComment.Add(commentAddView)

    ' Display the successful message
    If Request.IsAjaxRequest Then
        Return PartialView("AddCommentSuccessPartial", commentAddView)
    End If

    Return RedirectToAction("Details", New With {.id = commentAddView.Submission_ID})

End Function

Вопрос

При тестировании вышеуказанной функциональности, выполнение прошло успешно, вплоть до db.SaveChanges() в конструкторе ViewModel, однако выполнение просто останавливается после запуска этой строки. Я понятия не имею, что происходит, и в результате я полностью застрял.

Кто-нибудь знает, правильно ли я собираюсь добавить комментарий? Б) Почему эта строка останавливает выполнение без каких-либо ошибок?


Обновить

Спасибо Питеру Смиту за его предложение поставить Try Catch вокруг кода, я не знаю, почему я не задумывался и не делал этого в первую очередь.

Теперь я получаю следующую ошибку:

{MySql.Data.MySqlClient.MySqlException (0x80004005): у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '(ВЫБЕРИТЕ " & vbLf & " Submission_Comment, Submission_ID, " & vbLf & " Submission_Comment ". в строке 1" & vbCrLf & " в MySql.Data.MySqlClient.MySqlStream.ReadPacket()" & vbCrLf & " в MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& disabledRow, IntL & vs) в вставке Data.MySqlClient.Driver.GetResult(Statement-идентификатор Int32, Int32& disabledRows, Int64 и вставленный идентификатор) "& vbCrLf &" в MySql.Data.MySqlClient.Driver.NextResult(выражение Int32, логическая сила), & vlat..MySqlDataReader.NextResult()" & vbCrLf & " в MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(поведение CommandBehavior) Data.MySqlClient. связь, словарь 2 identifierValues, List 1 генерируется значения) "& vbCrLf &" в System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, адаптер IEntityAdapter)}

1 ответ

Решение

Мне удалось найти проблему и реализовать решение. Чтобы помочь другим, кто может столкнуться с той же проблемой, что и я, вот мое решение.

В моей схеме MySQL промежуточная таблица (Submission_Comment) между таблицами Submission и Comment имеет 2 столбца...Submission_ID и Comment_ID.

Когда я настраивал таблицы, я сделал эти столбцы Внешними ключами, но забыл сделать их составным первичным ключом. Создание 2-х столбцов составного первичного ключа решило мою проблему.

Другие вопросы по тегам