2016-04-29 30 views
0

データベースに新しい行を追加するための関数(addItem)があります。関数が実行されるときしかし、それは私に、このエラーを与える:MVCのデータベースに追加する際の外部キーの問題

{"The INSERT statement conflicted with the FOREIGN KEY constraint \"FK1\". The conflict occurred in database \"C:\\USERS\\ALAL0006\\DOWNLOADS\\SOA PROJEKT\\SOA PROJEKT\\SOA PROJEKT\\APP_DATA\\DATABASE1.MDF\", table \"dbo.Category\", column 'Id'.\r\nThe statement has been terminated."} 

コントローラー:

public ActionResult Create() 
    { 
     IEnumerable<SelectListItem> categories = tbl.Category.Select(c => new SelectListItem 
     { 
      Value = SqlFunctions.StringConvert((double)c.Id).Trim(), 
      Text = c.Namn 
     }); 
     //ViewBag.Category = new SelectList(tbl.Category, "Id", "Namn"); 
     ViewBag.Id = categories; 
     return View(); 
    } 
    [HttpPost] 
    public ActionResult Create(Vara newItm) 
    { 
     if (ModelState.IsValid) 
     { 
      srvc.addItem(newItm.Namn, newItm.Pris, newItm.CategoryID); 
      return RedirectToAction("Create"); 
     } 
     else 
     { 
      return View(); 
     } 
    } 

サービス:

public void addItem(string name, int price, int ctgID) 
    { 
     Database1Entities1 tbl = new Database1Entities1(); 
     Vara newItm = new Vara() { 

      Namn = name, 
      Pris = price, 
      CategoryID = ctgID, 

     }; 
     tbl.Vara.Add(newItm); 
     try 
     { 
      tbl.SaveChanges(); 
     } 

CSHTMLファイル:

 <div class="form-group"> 
     @Html.LabelFor(model => model.Namn, new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Namn) 
      @Html.ValidationMessageFor(model => model.Namn) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.Pris, new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Pris) 
      @Html.ValidationMessageFor(model => model.Pris) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.CategoryID, "CategoryID", new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.DropDownList("Id", "Välj kategori") 
      @Html.ValidationMessageFor(model => model.CategoryID) 
     </div> 
    </div> 

カテゴリーDB:

CREATE TABLE [dbo].[Category] (
[Id] INT   IDENTITY (1, 1) NOT NULL, 
[Namn] VARCHAR (MAX) NOT NULL, 
PRIMARY KEY CLUSTERED ([Id] ASC)); 

項目DB:

CREATE TABLE [dbo].[Vara] (
[Id]   INT   IDENTITY (1, 1) NOT NULL, 
[Namn]  VARCHAR (MAX) NOT NULL, 
[Pris]  INT   NOT NULL, 
[CategoryID] INT   NOT NULL, 
PRIMARY KEY CLUSTERED ([Id] ASC), 
CONSTRAINT [FK1] FOREIGN KEY ([CategoryID]) REFERENCES [dbo].[Category] ([Id])); 

私は私はこの問題を解決するために行うことになっています何がわからないと思います。何か案は?

+0

チェックCATID内には、主キーとしてカテゴリテーブルに存在します。 – Zaki

+0

@ Zaki Categoryテーブルには「Id」という名前があり、プライマリキーです。 –

+0

ありがとうございます@StephenMuecke –

答えて

0

POSTメソッドでは、プロパティCategoryIDのフォームコントロールを生成しないため、newItm.CategoryIDの値は0(デフォルトはint)です(生成する<select>要素のプロパティはIdです)。 ModelStateが無効の場合

あなたが

@Html.DropDownListFor(m => m.CategoryID, (IEnumerable<SelectListItem>)ViewBag.Id, "Välj kategori") 

はまた、あなたがViewBag.Idの値を再割り当てするためにあなたのPOSTメソッドを変更する必要があります(常に強く型付けされたxxxFor()メソッドを使用します)にあなたのビューでコードを変更する必要がありますあなたは、ビューを返すそうでない場合は例外が

[HttpPost] 
public ActionResult Create(Vara newItm) 
{ 
    if (ModelState.IsValid) 
    { 
     .... 
    } 
    ViewBag.Id = ... // same code as used in the GET method. 
    return View(newItm); 
} 

は、しかし、より良いアプローチは、ビューモデルを(What is ViewModel in MVC?を参照してください)を使用することですスローされます。

public class VaraVM 
{ 
    public int? ID { get; set; } 
    .... 
    [Display(Name = "Category")] 
    [Required(ErrorMessage = "Please select a category")] 
    public int SelectedCategory { get; set; } 
    public IEnumerable<SelectistItem> CategoryList { get; set; } 
} 

及び図

@Html.DropDownListFor(m => m.SelectedCategory , Model.CategoryList, "Välj kategori") 

コントローラ

public ActionResult Create() 
{ 
    VaraVM model = new VaraVM(); 
    ConfigureViewModel(model); 
    return View(model); 
} 

[HttpPost] 
public ActionResult Create(VaraVM model) 
{ 
    if (!ModelState.IsValid) 
    { 
     ConfigureViewModel(model); 
     return View(model); 
    } 
    // map the view model to a new instance of the data model 
    // save and redirect 
} 

private void ConfigureViewModel(VaraVM model) 
{ 
    model.CategoryList = .... // your query 
} 
-1

あなたはカテゴリーテーブル内の区分の外国のキー、 カテゴリーの表では、区分

+2

あなたの言っていることを理解することは非常に難しく、詳細が不十分です。 –

0

を送ってきたので、あなたがカテゴリのリストを格納しているためあなたが

@Html.ValidationMessageFor(model => model.CategoryID) 

で空model.CategoryIDを持って、バラのオブジェクト区分を送信ViewBag.Idに表示され、空のモデルで表示されました。

ViewBag.Id = categories; 
return View(); 

あなたの投稿はctgID = 0(d整数のフォールト値)。 EntityFrameworkによるデータベースへの保存ステップでは、CategoryテーブルがID = 0のローを持たないため、挿入が失敗している可能性があります(MSSQLのデフォルトの最初のローIDは1)

関連する問題