2016-04-29 50 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它確實存在,在類別表中有名稱「Id」,它是主鍵。 –

+0

非常感謝@StephenMuecke –

回答

0

您的問題是,在POST方法newItm.CategoryID的值爲0int的默認值),因爲您永遠不會爲屬性CategoryID(您生成的<select>元素爲屬性Id)生成表單控件。

您需要在您的視圖更改代碼(始終使用強類型xxxFor()方法)

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

此外,還需要修改POST方法重新分配的ViewBag.Id的值,如果ModelState無效並返回該視圖,否則將引發異常

[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

您發送瓦拉對象類別ID,因爲在分類表類別ID外鍵, 分類表已經發送類別ID

+2

很難理解你在說什麼,沒有足夠的細節。 –

0

你有空model.CategoryID在

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

因爲你存儲類別列表以ViewBag.Id並顯示視圖與空模型:

ViewBag.Id = categories; 
return View(); 

您的帖子生成ctgID = 0(d整數的默認值)。 在通過EntityFramework保存到數據庫的步驟中,您的插入可能失敗,因爲您的類別表沒有與ID = 0的行(默認第一行ID在MSSQL是1)