2017-10-23 15 views
3

私はこのアプリケーションを自分のアプリケーションで実行しています。 私はメインテーブルを作成するために必要な3つのテーブル、1つのメインテーブルと2つの他のテーブルを持って、メインテーブルは2つのテーブルに依存し、彼らは制約に接続されています。 私はメインテーブルを持っています:Word 次に、2つのテーブルがあります:難易度とカテゴリ。 難易度:簡単に作成し、カテゴリ:自然を作成しました。 これで2つの属性でできるだけ多くの単語を作成することができますが、それはエラーです。 私はこのようASP.Net MVC登録バグを作成する

Dificulty -> Category -> Word

または

Category -> Difficulty -> Word

を作成する場合、私は唯一の単語を作成することができます。 そのパスを作成せずに単語を作成することはできません。その理由はわかりません。 値は、2つのコンボボックスで呼び出されるデータベースに格納され、1つは難易度に、もう1つはカテゴリに格納されます。 単語を作成したい場合は、新しいカテゴリと新しい難易度を作成する必要があります。それ以外の場合はnullとして返します。

これは私のモデルビューです:

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; } 
    } 

これは私のコントローラである:

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); 
     } 

これが私の見解です:

<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> 
} 

私は私が手を挿入するために私のコードを実行するたびにこのエラー:

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.

詳細を確認すると、「カテゴリ」テーブルと「難易度」テーブルがヌルですが、他のフィールドはすべて私が与えた情報であることがわかります。あなたが使用するエンティティフレームワークを必要としている場合

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

HttpPostのpalavraアクションメソッドにブレークポイントを設定し、必要なプロパティ値をすべて確認してください。 – Shyju

答えて

1

は2つのオプション、最初のコードまたは最初のデータベースと、ここで

私の例最初のデータベースがあり、あなたのモデルであなたの制約を定義しする

Database First

dbからモデルを生成した後、足場を使ってcreate update deleteを作成する簡単なステップ

CRUDを作成するためにあなたがはるかに容易に足場を持つ

、あなた上記のいずれかの制約

例は、はい、あなたのドロップダウンリストが自動的に

たとえば私のコードメニュークリエーターコントローラ

を作成されます難易度/カテゴリーを選択して作業を作成した場合
// 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); 
    } 

、ここで再帰的な制約と私のモデルは

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; } 
} 
をPARENTID

ここで足場によって生成されたこれら3つのファイルは、また、あなたがVisual Studioに試すことができますasp.netコアMVCで私の意見

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");} 
 
}
ここ

例です最初に定義されたモデル

鍬これは役立ちます

歓迎

関連する問題