2012-11-22 24 views
2

我有一個Person型號:編輯模型,包括導航性能MVC4

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 

我想成爲可以從人員/編輯視圖編輯人員,支付卡和帳戶屬性。我正在使用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 

這裏是我的人/ EditorTemplates /賬號:

@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) 

我的人/ 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數據時,出現錯誤: 「發生了參照完整性約束衝突:定義參照約束的屬性值在關係中的主體和從屬對象之間不一致。 「db.Entry(pc).State = EntityState.Modified」

我在做什麼錯?

回答

0

你在你的代碼的幾個問題:

  1. 你爲什麼打電話db.SaveChanges()在你的行動多少次?最後只能調用一次。全部或全部保存。
  2. 當modelbinder爲您的動作創建參數對象時,它對EF一無所知。例如PaymentCard對象的Person屬性不會被設置。這可能是EF在您嘗試通過調用db.Entry(pc).State = EntityState.Modified將對象重新附加到datacontext時抱怨的一點。您應該通過數據庫中的id來重新查詢對象,並映射所需/更改的屬性。它更好的是不直接傳遞EF類到視圖,而是使用普通的ViewModel類。
  3. 您使用EditorFor作爲屬性Person.PaymentCards的類型ICollection(Of PaymentCard)。您的EditorTemplate的模型類型爲PaymentCard。這是行不通的。你可以寫另一個EditorTemplate爲ICollection(Of PaymentCard)或只是在你看來迭代(對不起,C#):

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