编辑模型,包括导航属性MVC4

时间:2012-11-22 13:17:07

标签: asp.net-mvc vb.net navigation

我有一个人模型:

Partial Public Class Person
Public Property Id As Long
<DisplayName("Fornavn")>
Public Property Firstname As String
<DisplayName("Efternavn")>
Public Property Lastname As String
Public Property chr_cpr As String
<DisplayName("Medarbejdernummer")>
Public Property EmployeeNumber As String


Public Overridable Property Accounts As ICollection(Of Account) = New HashSet(Of Account)

Public Overridable Property PaymentCards As ICollection(Of PaymentCard) = New HashSet(Of PaymentCard)

Public Overridable Property PaymentRoles As ICollection(Of PaymentRole) = New HashSet(Of PaymentRole)

Public Overridable Property AllPaymentRoles As ICollection(Of PaymentRole) = New HashSet(Of PaymentRole)

Public Overridable Property BillableDepartments As ICollection(Of Department) = New HashSet(Of Department)

Public Overridable Property AllDepartments As ICollection(Of Department) = New HashSet(Of Department)

Public Overridable Property AccessablePosDevices As ICollection(Of PosDevice) = New HashSet(Of PosDevice)

Public Overridable Property AllPosDevices As ICollection(Of PosDevice) = New HashSet(Of PosDevice)

End Class

还有一个帐户模型:

Partial Public Class Account
Public Property Id As Long
Public Property PersonId As Long
Public Property Balance As Decimal
Public Property SchemaId As Long
Public Property HasAutoRefill As Boolean

Public Overridable Property Schema As AccountSchema
Public Overridable Property Person As Person

End Class

还有一个paymentCard模型:

Partial Public Class PaymentCard
Public Property Id As Long
Public Property Serial As String
Public Property TypeId As Nullable(Of Long)
Public Property IsActive As Boolean
Public Property PersonId As Long

Public Overridable Property Type As CardType
Public Overridable Property Person As Person
End Class

我希望能够从Person / Edit视图中编辑Person,PaymentCard和Account属性。我正在使用EditorTemplates。这是我的观点:

@ModelType IDCompany.WEB.Person

@Using Html.BeginForm()
    @Html.ValidationSummary(True)
@<fieldset>
        <legend>Person</legend>

    @Html.HiddenFor(Function(model) model.Id)

    <div class="editor-label">
        @Html.LabelFor(Function(model) model.Firstname)
    </div>
    <div class="editor-field">
        @Html.EditorFor(Function(model) model.Firstname)
        @Html.ValidationMessageFor(Function(model) model.Firstname)
    </div>

    <div class="editor-label">
        @Html.LabelFor(Function(model) model.Lastname)
    </div>
    <div class="editor-field">
        @Html.EditorFor(Function(model) model.Lastname)
        @Html.ValidationMessageFor(Function(model) model.Lastname)
    </div>

    <div class="editor-label">
        @Html.LabelFor(Function(model) model.chr_cpr)
    </div>
    <div class="editor-field">
        @Html.EditorFor(Function(model) model.chr_cpr)
        @Html.ValidationMessageFor(Function(model) model.chr_cpr)
    </div>

    <div class="editor-label">
        @Html.LabelFor(Function(model) model.EmployeeNumber)
    </div>
    <div class="editor-field">
        @Html.EditorFor(Function(model) model.EmployeeNumber)
        @Html.ValidationMessageFor(Function(model) model.EmployeeNumber)
    </div>
 </fieldset>


@<table class="cardTable">
    <tr>
        <th>Id</th>
        <th>Serienummer</th>
        <th>Type</th>
        <th>Aktiv</th>
    </tr>
    @Html.EditorFor(Function(x) x.PaymentCards)
</table>

@Html.EditorFor(Function(x) x.Accounts)


@<p><input type="submit" value="Save" /></p>

End Using
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@Section Scripts
    @Scripts.Render("~/bundles/jqueryval")
End Section

这是我的Person / EditorTemplates / Account:

@ModelType IDCompany.WEB.Account

    @Html.EditorFor(Function(model) model.PersonId)
    @Html.EditorFor(Function(model) model.Id)
    @Html.EditorFor(Function(model) model.HasAutoRefill)
    @Html.EditorFor(Function(model) model.SchemaId)

我的Person / EditorTemplates / PaymentCard:

@ModelType IDCompany.WEB.PaymentCard


        @Html.HiddenFor(Function(model) model.TypeId)
        @Html.HiddenFor(Function(model) model.PersonId)

        @Html.HiddenFor(Function(model) model.Id)
        @Html.HiddenFor(Function(model) Model.Serial)
        @Html.HiddenFor(Function(model) Model.Type.Name)
 <tr class="cardRow">
            <td>@Model.Id</td>
            <td>@Model.Serial</td>
            <td>@Model.Type.Name</td>
           <td>@Html.EditorFor(Function(model) model.IsActive)</td>
 </tr>

这是我的PersonController中的编辑功能:

        <HttpPost()> _
    Function Edit(ByVal person As Person) As ActionResult
        Dim kontoSubMenu As New List(Of MenuPoint)
        Dim emptyList As New List(Of String)
        kontoSubMenu.Add(New MenuPoint("Kantine", emptyList, "Kontooplysninger", "Home", "All"))
        kontoSubMenu.Add(New MenuPoint("Personer", emptyList, "Personer", "Person", "All"))
        kontoSubMenu.Add(New MenuPoint("Test", emptyList, "LogUd", "Home", "All"))
        ViewBag.kontoSubMenu = kontoSubMenu
        If ModelState.IsValid Then

            Dim paymentcardList
            paymentcardList = person.PaymentCards.ToList()
            For Each pc In paymentcardList
                db.Entry(pc).State = EntityState.Modified

                db.SaveChanges()

            Next
            Dim accountList
            accountList = person.Accounts.ToList()
            For Each ac As Account In accountList
                db.Entry(ac).State = EntityState.Modified
                'Dim accountValue As Account = db.Accounts.Find(accountt.Id)

                db.SaveChanges()
            Next

            db.Entry(person).State = EntityState.Modified
            db.SaveChanges()

            Return RedirectToAction("Index")
        End If

        Return View(person)
    End Function

我是MVC的新手。 当我尝试在视图中编辑som数据时,我收到错误: “发生了引用完整性约束违规:定义引用约束的属性值在关系中的主体和从属对象之间不一致。” on“db.Entry(pc).State = EntityState.Modified”

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些问题:

  1. 为什么你在行动中多次致电db.SaveChanges()?你应该在结束时只调用一次。全部或全部保存。
  2. 当模型绑定器为您的动作创建参数对象时,它对EF一无所知。例如,Person对象的PaymentCard属性将不会被设置。当您尝试通过调用db.Entry(pc).State = EntityState.Modified将对象重新附加到datacontext时,这可能是EF抱怨的。您应该通过数据库中的id重新查询对象,并映射所需/更改的属性。最好不要将EF类直接传递给视图,而是使用普通的ViewModel类。
  3. 您使用EditorFor作为Person.PaymentCards类型的属性ICollection(Of PaymentCard)。您的EditorTemplate的模型类型为PaymentCard。那不行。您可以为ICollection(Of PaymentCard)编写另一个EditorTemplate,或者只是在您的视图中迭代(抱歉,在C#中):

    @foreach(var acc in Model.Accounts) {
        @Html.EditorFor(m => acc)
    }