2

私は人物モデルを持っています:

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が初めてです。ビューでいくつかのデータを編集しようとすると、「参照整合性制約違反が発生しました: 参照制約を定義するプロパティ値が、リレーションシップのプリンシパル オブジェクトと依存オブジェクトの間で一貫していません。」というエラーが表示されます。「db.Entry(pc).State = EntityState.Modified」について

私は何を間違っていますか?

4

1 に答える 1

0

コードにいくつかの問題があります。

  1. db.SaveChanges()アクションで何度も電話をかけているのはなぜですか?最後に一度だけ呼び出す必要があります。オール オア ナッシング。
  2. モデルバインダーがアクションのパラメーター オブジェクトを作成するとき、EF については何も知りません。たとえばPerson、オブジェクトのプロパティはPaymentCard設定されません。これはおそらく、 を呼び出してオブジェクトをデータコンテキストに再アタッチしようとしたときに EF が不平を言っているポイントですdb.Entry(pc).State = EntityState.Modified。データベースからIDでオブジェクトを再クエリし、必要な/変更されたプロパティをマップする必要があります。EF クラスをビューに直接渡すのではなく、代わりにプレーンな ViewModel クラスを使用することをお勧めします。
  3. タイプEditorForのプロパティに使用します。EditorTemplate のモデル タイプはです。それはうまくいきません。別の EditorTemplate を作成するか、ビューで反復することができます (申し訳ありませんが、C# で):Person.PaymentCardsICollection(Of PaymentCard)PaymentCardICollection(Of PaymentCard)

    @foreach(var acc in Model.Accounts) {
        @Html.EditorFor(m => acc)
    }
    
于 2012-11-22T15:17:29.910 に答える