2017-10-23 1 views
3

Ich habe dieses Ding bei meiner Anwendung ausgeführt. Ich habe 3 Tabellen, 1 Haupttabelle und 2 andere Tabellen, die benötigt werden, um die Haupttabelle zu erstellen, die Haupttabelle hängt von den 2 Tabellen ab, sie sind mit Einschränkungen verbunden. Ich habe die Haupttabelle: Word Dann habe ich die beiden anderen Tabellen: Schwierigkeiten und Kategorie. Ich habe den Schwierigkeitsgrad: Einfach erstellt und dann habe ich die Kategorie: Natur erschaffen. So, jetzt wäre ich in der Lage, so viele Wörter wie möglich mit diesen beiden Attributen zu erstellen, aber es gibt mir einen Fehler. Ich kann nur ein Wort erstellen, wenn ich auf diese Weise erstellenASP.Net MVC Erstellen eines Register Bug

Dificulty -> Category -> Word

oder

Category -> Difficulty -> Word

. Ich kann kein Wort ohne diesen Pfad erstellen und ich weiß nicht warum. Die Werte werden in einer Datenbank gespeichert, die in 2 ComboBoxen, 1 für die Schwierigkeit und der andere für Kategorie aufgerufen wird. Wenn ich ein Wort erstellen wollte, müsste ich eine neue Kategorie und eine neue Schwierigkeit erstellen, sonst wird es als null zurückgegeben.

Das ist mein Model View:

public partial class palavra 
    { 
     public int id_pal { get; set; } 
     public Nullable<int> LETRAS { get; set; } 
     public string PISTA { get; set; } 
     public int id_cat { get; set; } 
     public int id_dificuldade { get; set; } 
     public string nomepalavra { get; set; } 

     public virtual categoria categoria { get; set; } 
     public virtual dificuldade dificuldade { get; set; } 
    } 

Das ist mein Controller ist:

public ActionResult Index() 
     { 
      var palavras = db.palavras.Include(p => p.categoria).Include(p => p.dificuldade); 
      return View(palavras.ToList()); 
     } 



     // GET: palavras/Create 
     public ActionResult Create() 
     { 
      ViewBag.id_cat = new SelectList(db.categorias, "id_cat", "TIPO_CATEGORIA"); 
      ViewBag.id_dificuldade = new SelectList(db.dificuldades, "id_dificuldade", "TIPO_DIFICULDADE"); 
      return View(); 
     } 

     // POST: palavras/Create 
     // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
     // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create([Bind(Include = "id_pal,LETRAS,PISTA,id_cat,id_dificuldade,nomepalavra")] palavra palavra) 
     { 
      if (ModelState.IsValid) 
      { 
       db.palavras.Add(palavra); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      ViewBag.id_cat = new SelectList(db.categorias, "id_cat", "TIPO_CATEGORIA", palavra.id_cat); 
      ViewBag.id_dificuldade = new SelectList(db.dificuldades, "id_dificuldade", "TIPO_DIFICULDADE", palavra.id_dificuldade); 
      return View(palavra); 
     } 

Das ist meine Ansicht ist:

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.nomepalavra) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.LETRAS) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.PISTA) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.categoria.TIPO_CATEGORIA) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.dificuldade.TIPO_DIFICULDADE) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.nomepalavra) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.LETRAS) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.PISTA) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.categoria.TIPO_CATEGORIA) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.dificuldade.TIPO_DIFICULDADE) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.id_pal }) | 
      @Html.ActionLink("Details", "Details", new { id=item.id_pal }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.id_pal }) 
     </td> 
    </tr> 
} 

Jedes Mal, wenn ich meinen Code ausführen einfügen ich Dieser Fehler:

An exception of type 'System.Data.Entity.Infrastructure.DbUpdateException' occurred in EntityFramework.dll but was not handled in user code

Additional information: An error occurred while updating the entries. See the inner exception for details.

Wenn ich die Details überprüfe, scheint es, dass die "Category" -Tabelle und die "Difficulty" -Tabelle null sind, aber die anderen Felder haben alle die Informationen, die ich ihnen gegeben habe.

My Database Schema is the following:

Category connects to Word and Difficulty connects to Word.

Both Category and Difficulty are a 1 to many relationship with the table Word.

+0

einen Haltepunkt in Ihrem Httppost palavra Aktionsmethode Setzen und sehen Sie alll die erforderlichen Eigenschaftswerte haben. – Shyju

Antwort

1

, wenn Sie Sie verwenden Entity Framework werden benötigen eine Einschränkung bei Ihrem Modell definiert es 2 Möglichkeiten ist, Code erste oder Datenbank zuerst

hier mein Beispiel mit Datenbank zuerst

Database First

nachdem Sie Ihr Modell aus db generieren, einfach Schritt zum Erstellen erstellen Update löschen mit Gerüst

Scaffolding crud

mit Gerüsten Sie viel einfacher crud zu erstellen, und wenn irgendeine Einschränkung

obigen Beispiel befindet sich die Arbeit mit der Auswahl Schwierigkeitsgrad/Kategorie ja Ihre Dropdownlist erstellen automatisch

Beispiel meine Codes Menü Schöpfer Controller

erstellt werden
// GET: SystemMenus/Create 
    public IActionResult Create() 
    { 
     ViewData["ParentId"] = new SelectList(_context.SystemMenus, "Id", "Name");  
     ViewData["Color"] = new SelectList(OptionDropdown.GetBackgroundColor(), "Value", "Text"); 
     ViewData["Size"] = new SelectList(OptionDropdown.GetSize(), "Value", "Text"); 
     ViewData["Module"] = new SelectList(OptionDropdown.GetModule(), "Value", "Text"); 
     return View(); 
    } 

    // POST: SystemMenus/Create 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Create([Bind("Id,Name,Controller,Action,ParentId,Icon,Module,Description,FixHeader,Color,Size")] SystemMenu systemMenu) 
    { 
     if (ModelState.IsValid) 
     { 
      _context.Add(systemMenu); 
      await _context.SaveChangesAsync(); 
      return RedirectToAction(nameof(Index)); 
     } 
     ViewData["ParentId"] = new SelectList(_context.SystemMenus, "Id", "Name", systemMenu.ParentId); 
     ViewData["Color"] = new SelectList(OptionDropdown.GetBackgroundColor(), "Value", "Text", systemMenu.Color); 
     ViewData["Size"] = new SelectList(OptionDropdown.GetSize(), "Value", "Text", systemMenu.Size); 
     ViewData["Module"] = new SelectList(OptionDropdown.GetModule(), "Value", "Text", systemMenu.Module); 
     return View(systemMenu); 
    } 

und hier mein Modell mit rekursiven Einschränkung ParentID

public class SystemMenu 
{ 
    public SystemMenu() 
    { 
     Details = new HashSet<SystemMenu>(); 
    } 


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

    [StringLength(50)] 
    public string Name { get; set; } 

    [StringLength(50)] 
    public string Controller { get; set; } 
    [StringLength(50)] 
    public string Action { get; set; } 

    [ForeignKey("ParentId")] 

    public SystemMenu Parent { get; set; } 
    [Display(Name = "Parent")] 
    public int? ParentId { get; set; } 
    [StringLength(50)] 
    public string Icon { get; set; } 

    [StringLength(50)] 
    public string Module { get; set; } 

    [StringLength(200)] 
    [DataType(DataType.MultilineText)] 
    public string Description { get; set; } 
    public bool FixHeader { get; set; } 

    [StringLength(50)] 
    public string Color { get; set; } 

    [StringLength(50)] 
    public string Size { get; set; } 

    public ICollection<SystemMenu> Details { get; set; } 
} 

hier meine Ansichten

enter code 

@model NCFramework.Models.System.SystemMenu 
 

 
@{ 
 
    ViewData["Title"] = "Create"; 
 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
 
} 
 

 
<div class="row"> 
 
    <div class="col-md-4"> 
 
     <form asp-action="Create"> 
 
      <div asp-validation-summary="ModelOnly" class="text-danger"></div> 
 
      <div class="form-group"> 
 
       <label asp-for="Name" class="control-label"></label> 
 
       <input asp-for="Name" class="form-control" /> 
 
       <span asp-validation-for="Name" class="text-danger"></span> 
 
      </div> 
 
      <div class="form-group"> 
 
       <label asp-for="Controller" class="control-label"></label> 
 
       <input asp-for="Controller" class="form-control" /> 
 
       <span asp-validation-for="Controller" class="text-danger"></span> 
 
      </div> 
 
      <div class="form-group"> 
 
       <label asp-for="Action" class="control-label"></label> 
 
       <input asp-for="Action" class="form-control" /> 
 
       <span asp-validation-for="Action" class="text-danger"></span> 
 
      </div> 
 
      <div class="form-group"> 
 
       <label asp-for="ParentId" class="control-label"></label> 
 
       <select asp-for="ParentId" class ="form-control" asp-items="ViewBag.ParentId"> 
 
        <option value="">Select</option> 
 
       </select> 
 
      </div> 
 
      <div class="form-group"> 
 
       <label asp-for="Icon" class="control-label"></label> 
 
       <input asp-for="Icon" class="form-control" /> 
 
       <span asp-validation-for="Icon" class="text-danger"></span> 
 
      </div> 
 
      <div class="form-group"> 
 
       <label asp-for="Module" class="control-label"></label> 
 
       <select asp-for="Module" class="form-control" asp-items="ViewBag.Module"> 
 
        <option value="">Select</option> 
 
       </select> 
 
       <span asp-validation-for="Module" class="text-danger"></span> 
 
      </div> 
 
      <div class="form-group"> 
 
       <label asp-for="Description" class="control-label"></label> 
 
       <input asp-for="Description" class="form-control" /> 
 
       <span asp-validation-for="Description" class="text-danger"></span> 
 
      </div> 
 
      <div class="form-group"> 
 
       <div class="mt-checkbox-list"> 
 
        <label class="mt-checkbox mt-checkbox-outline"> 
 
         @Html.DisplayNameFor(model => model.FixHeader) 
 
         <input asp-for="FixHeader" class="checkbox-inline" /> 
 
         <span></span> 
 
        </label> 
 
       </div> 
 
      </div> 
 
      <div class="form-group"> 
 
       <label asp-for="Color" class="control-label"></label> 
 
       <select asp-for="Color" class="form-control" asp-items="ViewBag.Color"> 
 
        <option value="">Select</option> 
 
       </select> 
 
       <span asp-validation-for="Color" class="text-danger"></span> 
 
      </div> 
 
      <div class="form-group"> 
 
       <label asp-for="Size" class="control-label"></label> 
 
       <select asp-for="Size" class="form-control" asp-items="ViewBag.Size"> 
 
        <option value="">Select</option> 
 
       </select> 
 
       <span asp-validation-for="Size" class="text-danger"></span> 
 
      </div> 
 
      <div class="form-group"> 
 
       <input type="submit" value="Create" class="btn btn-default" /> 
 
      </div> 
 
     </form> 
 
    </div> 
 
</div> 
 

 
<div> 
 
    <a asp-action="Index">Back to List</a> 
 
</div> 
 

 
@section Scripts { 
 
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} 
 
}

hier

das Beispiel mit asp.net Kern mvc Sie können auch mit Visual Studio versuchen, diese 3 von Gerüsten generierten Dateien mit Definiertes Modell zuerst

Hacke das hilft

prost

Verwandte Themen