【问题标题】:Asp.Net MVC 4 - Adding an object model to an ICollection within another object modelAsp.Net MVC 4 - 将对象模型添加到另一个对象模型中的 ICollection
【发布时间】:2012-12-19 15:42:25
【问题描述】:

一些背景

我的 Asp.Net MVC 4 数据库第一个应用程序、提交和评论中有 2 个表。 (还有很多,但与这个问题无关)。任何给定的提交都可以关联任意数量的评论(一对多)。

我有一个提交详细信息页面,用户可以在该页面上打开一个带有部分视图的 jQuery 对话框,以便为提交添加评论。此部分视图绑定到为添加 cmets 而创建的强类型视图模型。

表格/模型

提交表

这是提交表的类模型。 (为简单起见,我省略了一些属性)。

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

要求

我想要做的是向给定提交的已存在的 cmets 集合添加新评论。

到目前为止...

到目前为止,我有一个添加注释对话框的视图模型,它在我的控制器中初始化,然后将填充的视图模型返回给控制器的 post 方法。这是代码

视图模型

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

控制器获取方法

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

Controller Post 方法

<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

问题

在测试上述功能时,在 ViewModel 构建器中一直执行到 db.SaveChanges() 是成功的,但是一旦运行此行,执行就会停止。我不知道发生了什么,结果完全卡住了。

有谁知道A)我要以正确的方式添加评论吗? B) 为什么这一行在没有任何错误的情况下停止执行?


更新

感谢 Peter Smith 提出的在代码周围放置 Try Catch 的建议,我不知道为什么我一开始没有想到或这样做。

我现在收到以下错误:

{MySql.Data.MySqlClient.MySqlException (0x80004005):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在第 1 行的 '(SELECT" & vbLf & " Submission_Comment.Submission_ID, " & vbLf & " Submission_Comment.' at line 1" & vbCrLf & 附近使用"在 MySql.Data.MySqlClient.MySqlStream.ReadPacket()" & vbCrLf & " 在 MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)" & vbCrLf & " 在 MySql.Data.MySqlClient.Driver.GetResult (Int32 statementId,Int32& 影响行,Int64&insertedId)“& vbCrLf &”在 MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId,布尔力)“& vbCrLf &“在 MySql.Data.MySqlClient.MySqlDataReader.NextResult()” & vbCrLf & " 在 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior 行为)" & vbCrLf & " 在 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()" & vbCrLf & " 在 MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery ()" & vbCrLf & " 在 MySql.Data.Entity.EFMySqlCommand.ExecuteNonQuery()" & vbCrLf & " 在 System.Data.Mapping.Update.In ternal.DynamicUpdateCommand.Execute(UpdateTranslator 转换器,EntityConnection 连接,Dictionary2 identifierValues, List1 generatedValues)" & vbCrLf & " at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter 适配器)}

【问题讨论】:

  • 尝试(原文如此)在您的 Add 方法中的 db 部分周围添加一个 try catch 块;这应该会为您提供有关错误的更多详细信息。

标签: asp.net-mvc model icollection


【解决方案1】:

我设法找到了问题并实施了解决方案。为了帮助可能遇到与我相同问题的其他人,这是我的解决方案。

在我的 MySQL 架构中,Submission 和 Comment 表之间的中间表 (Submission_Comment) 有 2 列...Submission_ID 和 Comment_ID。

当我设置表时,我将这些列设为外键,但忘记将它们设为复合主键。 将 2 列设为复合主键解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2020-11-04
    • 2013-04-02
    相关资源
    最近更新 更多