• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

ASP.NET MVC 4 EntityFramework 6 - Problem z przesłaniem wartości z drop down list do bazy danych

+1 głos
543 wizyt
pytanie zadane 6 maja 2015 w C# przez Luk Nowicjusz (130 p.)

Witam,

Na wstępie powiem, że jestem początkujący wiec proszę o litośćwink

Piszę aplikację webową w której są dwie klasy w modelu

 

Publication:

amespace ManagerPublikacji.Domain.Entities
{
    public class Publication
    {
        [HiddenInput(DisplayValue=false)]
        public int PublicationID { get; set; }

        [Required(ErrorMessage="Proszę podać nazwę publikacji.")]
        public string Name { get; set; }

        [DataType(DataType.MultilineText)]
        [Required(ErrorMessage = "Proszę podać opis publikacji.")]
        public string Description { get; set; }

        [HiddenInput(DisplayValue = false)]
        [ForeignKey("Category")]
        public int CategoryId { get; set; }

        public byte[] PdfData { get; set; }

        [HiddenInput(DisplayValue = false)]
        public string PdfMimeType { get; set; }

        [HiddenInput(DisplayValue = false)]
        public int UsersID { get; set; }

        public virtual Category Category { get; set; }
    }
}

Category:

namespace ManagerPublikacji.Domain.Entities
{
    public class Category
    {
        [HiddenInput(DisplayValue = false)]
        public int CategoryId { get; set; }

        [Required(ErrorMessage = "Proszę podać nazwę Kategorii.")]
        public string CategoryName { get; set; }

        public virtual ICollection<Publication> Publications { get; set; }
    }
}

Podczas próby dodania do bazy publikacji

Występuje błąd:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.Publication_dbo.Category_CategoryId". The conflict occurred in database "Publikacje", table "dbo.Category", column 'CategoryId'.
The statement has been terminated.

 

 

Kod kontrolera odpowiedzialny za te akcje:

public ActionResult Edit(int publicationId)
        {

            Publication publication = repositoryP.Publications
                .FirstOrDefault(p => p.PublicationID == publicationId);
            PopulateCategoriesDropDownList(publication.CategoryId);
            return View(publication);
        }

        [HttpPost]
        public ActionResult Edit(HttpPostedFileBase pdf, [Bind(Include = "PublicationId,Name,Description,CategoryId,PdfData,PdfMimeType,UsersID")] Publication publication)
        {
            if (ModelState.IsValid)
            {
                if (pdf != null)
                {
                    publication.PdfMimeType = pdf.ContentType;
                    publication.PdfData = new byte[pdf.ContentLength];
                    pdf.InputStream.Read(publication.PdfData, 0, pdf.ContentLength);
                }

                publication.UsersID = (int)WebSecurity.CurrentUserId;
                repositoryP.SavePublication(publication);
                TempData["message"] = string.Format("Zapisano {0}", publication.Name);
                
                return RedirectToAction("Index");
            }
            else
            {
                PopulateCategoriesDropDownList(publication.CategoryId);
                return View(publication);
            }
        }

        private void PopulateCategoriesDropDownList(object selectedCategory = null)
        {
            var categoriesQuery = from d in repositoryC.Categories
                                  orderby d.CategoryName
                                  select d;
            ViewData["catid"] = new SelectList(categoriesQuery, "CategoryId ", "CategoryName", selectedCategory);

            

        }

        public ViewResult Create()
        {
            PopulateCategoriesDropDownList();
            return View("Edit", new Publication());
        }

oraz widoku:

@model ManagerPublikacji.Domain.Entities.Publication

@{
    ViewBag.Title = "Admin: edycja " + @Model.Name;
    Layout = "~/Views/Shared/_AdminLayout.cshtml";
}

<h1>Edycja @Model.Name</h1>

@using (Html.BeginForm("Edit", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    
    @Html.EditorForModel()
        <div class="form-group">
            @Html.LabelFor(model => model.CategoryId, "CategoryId", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("catid")
                @Html.ValidationMessageFor(model => model.CategoryId, "", new { @class = "text-danger" })
            </div>
        </div>
    <div class="editor-label">Pdf</div>
    <div>Prześlij pdf: <input type="file" name="PDF"/></div>
    <input type="submit" value="Zapisz"/>
    @Html.ActionLink("Anuluj i wróć do listy ", "Index")
}

Z tego co zauważyłem to drop down list albo przekazuje do publication.CategoryId wartość 0 albo w ogole nie przekazuje i jest ona ustawiana domyslnie. Swój kod opierałem w dużej mierze na książce "ASP.NET MVC 4 Zaawansowane Programowanie" Adama Freemana. Proszę o pomoc i z góry za takową dziękuję.

1 odpowiedź

0 głosów
odpowiedź 7 maja 2015 przez JachuPL Bywalec (2,950 p.)

musisz najpierw stworzyć rekord z takim kluczem w bazie lub edytować istniejący

http://stackoverflow.com/questions/21518995/the-insert-statement-conflicted-with-the-foreign-key-constraint-error

Podobne pytania

+1 głos
1 odpowiedź 1,243 wizyt
pytanie zadane 3 sierpnia 2015 w C# przez MakaayPL Nowicjusz (130 p.)
+2 głosów
1 odpowiedź 1,072 wizyt
pytanie zadane 19 czerwca 2015 w C# przez JachuPL Bywalec (2,950 p.)
+2 głosów
2 odpowiedzi 1,372 wizyt
pytanie zadane 7 września 2015 w C# przez wanderer Gaduła (3,710 p.)

93,731 zapytań

142,669 odpowiedzi

323,286 komentarzy

63,291 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...