2016-04-29 9 views
0

Ich habe eine Funktion (AddItem), die eine neue Zeile zu meiner Datenbank hinzugefügt wird. Aber wenn die Funktion ausgeführt wird, es gibt mir diese Fehlermeldung:Probleme mit Fremdschlüsseln beim Hinzufügen zur Datenbank in 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."} 

Controller:

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

Service:

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 Datei:

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

Kategorie DB:

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

Artikel 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])); 

Ich bin nicht sicher, was soll ich tun, um dies zu beheben. Irgendwelche Ideen?

+0

prüfen catID existieren in Kategorietabelle als Primärschlüssel. – Zaki

+0

@Zaki Es existiert, hat den Namen "Id" in der Kategorie-Tabelle und es ist der Primärschlüssel. –

+0

Vielen Dank @StephenMuecke –

Antwort

0

Ihr Problem ist, dass in der POST-Methode Wert von newItm.CategoryID ist 0 (Standardeinstellung für int), weil Sie nie ein Formular Kontrolle für Immobilien CategoryID (das <select> Element, das Sie ist für Eigenschaft Id Erzeugung) erzeugen.

Sie müssen den Code in Ihrer Ansicht ändern (immer die stark typisierte xxxFor() Methoden verwenden)

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

Darüber hinaus müssen Sie Ihre POST-Methode ändern, um den Wert von ViewBag.Id neu zuzuweisen, wenn ModelState ungültig und Sie kehren die Ansicht, andernfalls wird eine Ausnahme

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

jedoch ein besserer Ansatz geworfen werden ist eine Ansicht Modelle zu verwenden (siehe 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; } 
} 

und in der Ansicht

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

und in der Steuerung

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

Sie senden Vara Objekt CategoryID, weil CategoryID Fremdschlüssel in Kategorie Tabelle haben Kategorie Tisch gewesen senden Sie CategoryID

+2

Es ist sehr schwer zu verstehen, was Sie sagen und nicht genug Details. –

0

Sie haben leere model.CategoryID in

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

weil Sie Liste der Kategorien gespeichert zu ViewBag.Id und zeigte Ansicht mit leerem Modell:

ViewBag.Id = categories; 
return View(); 

Ihr Beitrag mit ctgID = 0 (d erzeugt wird, Standardwert von Integer). In Speichern Schritt zu Datenbank über EntityFramework wahrscheinlich Ihr Einsatz fehlgeschlagen, weil Ihre Kategorie Tabelle nicht Zeile mit Id = 0 hat. (Standard erste Zeile Id in MSSQL ist 1)

Verwandte Themen