いくつかの背景
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, List
1 generatedValues)" & vbCrLf & " at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)}