1

いくつかの背景

Asp.Net MVC 4 データベースの最初のアプリケーション、Submission と Comment に 2 つのテーブルがあります。(他にもたくさんありますが、この質問には関係ありません) . 提出物には、任意の数のコメント (1 対多) を関連付けることができます。

私は提出の詳細ページを持っています。このページで、ユーザーは jQuery ダイアログ ボックスを開いて内部に部分的なビューを表示し、提出にコメントを追加できます。この部分的なビューは、コメントを追加するために作成された厳密に型指定されたビューモデルにバインドされています。

テーブル/モデル

提出表

Submission テーブルのクラス モデルを次に示します。(簡単にするために一部のプロパティを省略しています)。

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

コメント表

Comment テーブルのクラス モデルは次のとおりです。(繰り返しますが、簡単にするために一部のプロパティを省略しています)。

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

要件

私がやろうとしているのは、特定の提出物に対して既に存在するコメントのコレクションに新しいコメントを追加することです。

ここのところ...

これまでのところ、コントローラーで初期化され、入力されたビューモデルをコントローラーのポストメソッドに返すコメント追加ダイアログボックスのビューモデルがあります。ここにコードがあります

ビューモデル

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 ビルダー

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

コントローラの Get メソッド

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 ビルダーまで成功しますが、この行が実行されると実行が停止します。何が起こっているのかわからず、その結果、完全に立ち往生しています。

A)コメントを正しい方法で追加しようとしているかどうか、誰かが知っていますか? B)この行がエラーなしで実行を停止しているのはなぜですか?


アップデート

コードの周りに Try Catch を配置するという彼の提案について、Peter Smith に感謝します。そもそもなぜそれを考えなかったのか、または実行しなかったのかわかりません。

次のエラーが表示されます。

{MySql.Data.MySqlClient.MySqlException (0x80004005): SQL 構文にエラーがあります。Submission_Comment'(SELECT" & vbLf & " . Submission_ID, " & vbLf & " の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください 。Submission_Comment.' 行 1" & vbCrLf & " at MySql.Data.MySqlClient.MySqlStream.ReadPacket()" & vbCrLf & " at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertId)" & vbCrLf & " at MySql. Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& InsertedId)" & vbCrLf & " at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)" & vbCrLf & " at MySql.Data.MySqlClient .MySqlDataReader.NextResult()" & vbCrLf & " at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)" & vbCrLf & " at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()" & vbCrLf & " at MySql. Data.MySqlClient.MySqlCommand.2 identifierValues, List1 generatedValues)" & vbCrLf & " at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)}

4

1 に答える 1

1

問題を見つけて解決策を実装することができました。私と同じ問題に遭遇する可能性のある他の人を助けるために、これが私の解決策でした.

私の MySQL スキーマでは、Submission テーブルと Comment テーブルの間の中間テーブル (Submission_Comment) には、Submission_ID と Comment_ID の 2 つの列があります。

テーブルをセットアップしたとき、これらの列を外部キーにしましたが、それらを複合主キーにするのを忘れていました。2 つの列を複合主キーにすることで問題が解決しました。

于 2012-12-21T14:16:23.973 に答える