2017-03-03 6 views
0

Ich lerne MVC arbeitet an einem ASP.NET MVC-Projekt für ein Noteninventar System und haben zwei Tabellen: ScoreList und KeySignature. Die KeySignature-Tabelle verfügt über Primärschlüssel (Id) und KeySignatureName. Ich habe eine andere Tabelle, mit der ich arbeite, ScoreListItems, aber ich denke, dass eine für mein Problem nicht relevant ist.Wie speichere ich den Primärschlüssel des untergeordneten Modells/Tabelle als Fremdschlüssel im übergeordneten Modell/Tabelle?

Ich versuche herauszufinden, wie man ein paar Dinge tut.

1) Wenn ich einen neuen ScoreList-Datensatz erstelle, möchte ich, dass das KeySignature-Feld eine Dropdown-Liste ist, die die KeySignatureNames aus der KeySignature-Tabelle auffüllt.

2) Wenn ich den Datensatz speichern möchte ich die ScoreList-Tabelle die KeySignatureId speichern.

Während ich dies schreibe klingt es wie es sollte wirklich einfach sein, aber ich habe mir die ganze Woche den Kopf kratzen und kann es nicht herausfinden. Jede Hilfe wäre willkommen.

Das ist, was ich bisher habe:

Key Signature Modell:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace CreswellSolution.Model 
{ 
    public class KeySignature 
    { 
     public int KeySignatureId { get; set; } 
     public string KeySignatureName { get; set; } 

    } 
} 

ScoreListModel:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace CreswellSolution.Model 
{ 
    public class ScoreList : IObjectWithState 
    { 
     public ScoreList() 
     { 
      ScoreListItems = new List<ScoreListItem>(); 
     } 

     public int ScoreListId { get; set; } 
     public string ScoreListName { get; set; } 
     public string ScoreListComposer { get; set; } 
     public int KeySignatureId { get; set; } 

     public virtual List<ScoreListItem> ScoreListItems { get; set; } 

     public ObjectState ObjectState { get; set; } 
    } 
} 

ScoreListViewModel:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using CreswellSolution.Model; 

namespace CreswellSolution.Web.ViewModels 
{ 
    public class ScoreListViewModel : IObjectWithState 
    { 
     public ScoreListViewModel() 
     { 
      ScoreListItems = new List<ScoreListItemViewModel>(); 
      ScoreListItemsToDelete = new List<int>(); 
     } 

     public int ScoreListId { get; set; } 
     public string ScoreListName { get; set; } 
     public string ScoreListComposer { get; set; } 
     public int KeySignatureId { get; set; } 

     public List<ScoreListItemViewModel> ScoreListItems { get; set; } 

     public List<int> ScoreListItemsToDelete { get; set; } 

     public string MessageToClient { get; set; } 

     public ObjectState ObjectState { get; set; } 
    } 
} 

Helfer sehen Modell:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using CreswellSolution.Model; 

namespace CreswellSolution.Web.ViewModels 
{ 
    public static class Helpers 
    { 
     public static ScoreListViewModel CreateScoreListViewModelFromScoreList(ScoreList scoreList) 
     { 
      ScoreListViewModel scoreListViewModel = new ScoreListViewModel(); 
      scoreListViewModel.ScoreListId = scoreList.ScoreListId; 
      scoreListViewModel.ScoreListName = scoreList.ScoreListName; 
      scoreListViewModel.ScoreListComposer = scoreList.ScoreListComposer; 
      scoreListViewModel.KeySignatureId = scoreList.KeySignatureId; 
      scoreListViewModel.ObjectState = ObjectState.Unchanged; 

      foreach (ScoreListItem scoreListItem in scoreList.ScoreListItems) 
      { 
       ScoreListItemViewModel scoreListItemViewModel = new ScoreListItemViewModel(); 
       scoreListItemViewModel.ScoreListItemId = scoreListItem.ScoreListItemId; 
       scoreListItemViewModel.PartName = scoreListItem.PartName; 
       scoreListItemViewModel.TotalParts = scoreListItem.TotalParts; 
       scoreListItemViewModel.PartsCheckedOut = scoreListItem.PartsCheckedOut; 

       scoreListItemViewModel.ObjectState = ObjectState.Unchanged; 

       scoreListItemViewModel.ScoreListId = scoreList.ScoreListId; 

       scoreListViewModel.ScoreListItems.Add(scoreListItemViewModel); 
      } 

      return scoreListViewModel; 
     } 


     public static ScoreList CreateScoreListFromScoreListViewModel(ScoreListViewModel scoreListViewModel) 
     { 
      ScoreList scoreList = new ScoreList(); 
      scoreList.ScoreListId = scoreListViewModel.ScoreListId; 
      scoreList.ScoreListName = scoreListViewModel.ScoreListName; 
      scoreList.ScoreListComposer = scoreListViewModel.ScoreListComposer; 
      scoreList.KeySignatureId = scoreListViewModel.KeySignatureId; 
      scoreList.ObjectState = scoreListViewModel.ObjectState; 

      int temporaryScoreListItemId = -1; 

      foreach (ScoreListItemViewModel scoreListItemViewModel in scoreListViewModel.ScoreListItems) 
      { 
       ScoreListItem scoreListItem = new ScoreListItem(); 
       scoreListItem.PartName = scoreListItemViewModel.PartName; 
       scoreListItem.TotalParts = scoreListItemViewModel.TotalParts; 
       scoreListItem.PartsCheckedOut = scoreListItemViewModel.PartsCheckedOut; 

       scoreListItem.ObjectState = scoreListItemViewModel.ObjectState; 

       if (scoreListItemViewModel.ObjectState != ObjectState.Added) 
        scoreListItem.ScoreListItemId = scoreListItemViewModel.ScoreListItemId; 
       else 
       { 
        scoreListItem.ScoreListItemId = temporaryScoreListItemId; 
        temporaryScoreListItemId--; 
       } 

       scoreListItem.ScoreListId = scoreListViewModel.ScoreListId; 

       scoreList.ScoreListItems.Add(scoreListItem); 
      } 

      return scoreList; 
     } 

Antwort

0

Stellen Sie zunächst sicher, dass Ihre Entitäten korrekt modelliert sind. Sie sollten wie etwas aussehen:

public class ScoreList 
{ 
    [Key] 
    public int Id { get; set; } 

    ... 

    [ForeignKey("KeySignature")] 
    public int KeySignatureId { get; set; } 
    public virtual KeySignature KeySignature { get; set; } 
} 

Dann in Ihrer Aktion, Sie brauchen nur eine IEnumerable<SelectListItem> mit den verfügbaren KeySignature Optionen zu erhalten:

var keySignatureOptions = db.KeySignatures.Select(m => new SelectListItem 
{ 
    Value = m.Id.ToString(), 
    Text = m.Name 
}); 

können Sie entweder speichern diese in ViewBag oder vorzugsweise Verwenden Sie ein Ansichtsmodell und legen Sie es darauf fest.

Dann Ihrer Ansicht nach:

@Html.DropDownListFor(m => m.KeySignatureId, (IEnumerable<SelectListItem>)ViewBag.KeySignatureOptions) 

Oder

@Html.DropDownListFor(m => m.KeySignatureId, Model.KeySignatureOptions) 

Je nachdem, welche Richtung Ihr ging.

Das ist es. Der ausgewählte Wert wird wieder an die Fremdschlüsseleigenschaft gesendet. Sie speichern also wie gewohnt und Sie sind fertig.

+0

Vielen Dank für die schnelle Antwort! Ich werde es versuchen, wenn ich in ein paar Stunden eine Chance bekomme. – stradixx

+0

Ich habe meine Frage mit etwas Code, den ich bereits habe, aktualisiert. Ich verwende ViewModels - ich habe eine Helpers-Klasse und eine ScoreListViewModel-Klasse. Wie gehe ich vor, um die oben erwähnte keySignatureOptions-Variable zu speichern? – stradixx

Verwandte Themen