MVC Saving data from model containing 2 models to database

0

First solve:

db.KreatoryZamowien.Add(model.KreatorZamowien);
db.Nabywcy.Add(model.Nabywca);
db.SaveChanges();

That is adding data to two tables. How Can I add related IDs to junction table (NabywcaKreatorzamowien)?

****************** Question: *************** I have created related tables, figured out how to display that data in my View. (jejejej) Now when I'm trying to save that data to database I'm getting exception.

Exception:

System.NullReferenceException occurred
  HResult=0x80004003
  Message=The object reference has not been set to the instance of the object.
  Source=<Cannot evaluate the exception source>
  StackTrace:
   at Panele.Controllers.KreatorZamowienController.Create(KreatorZamowienNabywca model) in C:\Users\bplos\Source\Repos\Panele\Panele\Controllers\KreatorZamowienController.cs:line 81
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f()

Exception appears in controller in line within:

emp.KreatorZamowien.NumerZamowienia = model.KreatorZamowien.NumerZamowienia;

I don't know why, cos it gets value from model and is assigning to object.:(

My database schema:

KreatorZamowien(Id, NumerZamowienia)  -------------------------------|
                                                                     |
NabywcaKreatorzamowien (KreatorZamowien_Id, Nabywca_Nabywca_Id)------|
                                                                     |
Nabywca(Nabywca_Id, Nazwa) ------------------------------------------|

My models:

KreatorZamowien.cs

public class KreatorZamowien
    {
        public int Id { get; set; }
        public int NumerZamowienia { get; set; }
        public virtual ICollection<Nabywca> Nabywcy { get; set; }
    }

Nabywca.cs

 public class Nabywca
    {
        public int NabywcaId { get; set; }
        public string Nazwa { get; set; }
        public virtual ICollection<KreatorZamowien> KreatoryZamowien { get; set; }
    }

Model containing 2 models to display them in View: KreatoryZamowienNabywca.cs

 public class KreatorZamowienNabywca
    {
        public KreatorZamowien KreatorZamowien { get; set; }
        public Nabywca Nabywca { get; set; }
    }

My Create.chtml View:

@model Panele.Models.KreatorZamowienNabywca
@using (Ajax.BeginForm("Create", "KreatorZamowien", new AjaxOptions { HttpMethod = "POST", LoadingElementId = "loader", OnSuccess = "onAjaxRequestSuccess" }, new
{
    @id = "AjaxformId",
    @class = "form-horizontal",
    role = "form"
}))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })

   @Html.DisplayNameFor(m => m.KreatorZamowien.NumerZamowienia)
   @Html.TextBoxFor(m => m.KreatorZamowien.NumerZamowienia)

  @Html.DisplayNameFor(m => m.Nabywca.Nazwa)
  @Html.TextBoxFor(m => m.Nabywca.Nazwa)

  <input id="btnSubmit" class="ico2" type="submit" value="Zapisz zamówienie" form="AjaxformId" />
}

KreatorZamowienController.cs

public class KreatorZamowienController : Controller

    {
        private ShopContext db = new ShopContext();

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Create(KreatorZamowienNabywca model)
        {
            try
            {
                // Verification  
                if (ModelState.IsValid)
                {
                    ShopContext db = new ShopContext();

                    KreatorZamowienNabywca emp = new KreatorZamowienNabywca();
                    emp.KreatorZamowien.NumerZamowienia = model.KreatorZamowien.NumerZamowienia;

                    emp.Nabywca.Nazwa = nabywca.Nazwa;

                    db.KreatoryZamowien.Add(emp.KreatorZamowien);
                    db.Nabywcy.Add(emp.Nabywca);
                    db.SaveChanges();


                    // Info.  
                    return this.Json(new
                    {
                        EnableSuccess = true,
                        SuccessTitle = "Success",
                        SuccessMsg = "Zapisano zamówienie o numerze: " + model.KreatorZamowien.NumerZamowienia + "."
                    });
                }

            }
            catch (Exception ex)
            {
                // Info  
                Console.Write(ex);
                throw ex;
            }
            // Info  
            return this.Json(new
            {
                EnableError = true,
                ErrorTitle = "Error",
                ErrorMsg = "Coś poszło nie tak! Sprawdź formularz."
            });
            //return View(model);
        }
c#
asp.net-mvc
entity-framework
model-view-controller
asked on Stack Overflow Jan 7, 2018 by BartusZak • edited Jan 7, 2018 by BartusZak

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0