0
votes

I am using Breeze WebAPI to save a new row to my database but when I try to call the method SaveChanges() I get the error Invalid object name 'dbo.tblAgencyQuery.

See below for my code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Breeze.WebApi;
using AgencyUpdate.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace AgencyUpdate.Controllers
{
    [BreezeController]
    public class BreezeController : ApiController
    {

        readonly EFContextProvider<AgencyDbContext> _ContextProvider =
            new EFContextProvider<AgencyDbContext>();

         [HttpGet]
        public string MetaData()
        {
            return _ContextProvider.Metadata();
        }

        [HttpGet]
        public IQueryable<api_Agency> GetAgency()
        {
            return _ContextProvider.Context.api_Agency;
        }

        [HttpPost]
        public void SaveData(JObject data)
        {
            Newtonsoft.Json.Linq.JToken[] agency = data.GetValue("agency").ToArray();
            dynamic DeserializedData = JsonConvert.DeserializeObject(agency[0].ToString());

            //using (var context = new AgencyDbContext())
            //{
            //    tblAgencyQuery AgencyQuery = new tblAgencyQuery(); {
            //        AgencyQuery.QueryID = Guid.NewGuid();
            //        AgencyQuery.QueryText = agency[0].ToString();
            //        AgencyQuery.AgencyID = DeserializedData.agencyID;

            //    };
            //    context.tblAgencyQuery.Add(AgencyQuery);
            //    context.SaveChanges();
            //}

            tblAgencyQuery tblAgencyQuery = new tblAgencyQuery();
            tblAgencyQuery.QueryID = Guid.NewGuid();
            tblAgencyQuery.QueryText = agency[0].ToString();
            tblAgencyQuery.AgencyID = DeserializedData.agencyID;

            _ContextProvider.Context.tblAgencyQuery.Add(tblAgencyQuery);
            _ContextProvider.Context.Entry(tblAgencyQuery).State = System.Data.EntityState.Added;
            _ContextProvider.Context.SaveChanges();

        }


        [HttpGet]
        public IQueryable<api_AgencyOffice> GetOffice()
        {
            return _ContextProvider.Context.api_AgencyOffice;
        }

        [HttpGet]
        public IQueryable<api_AgencyContact> GetContact()
        {
            return _ContextProvider.Context.api_AgencyContact;
        }

    }
}

I am calling public void SaveData(JObject data) from my javascript. I deserialize the data and assign the values to a new instance of tblAgencyQuery. Then I add it to the context so I have the data ready to be saved.

But SavedChanges() doesn't like my object. Is it expecting a different object?

This is the exception window

enter image description here

My JavaScript Method

 var saveChanges = function (agencyObservable) {

            if (agencyObservable) {
                var data = ko.toJSON(agencyObservable);
                var options = {
                    url: '/breeze/SaveData',
                    type: 'POST',
                    dataType: 'json',
                    data: data,
                    contentType: "application/json; charset=utf-8"
                }

                return $.ajax(options)
                .then(saveSucceeded)
                .fail(saveFailed);

                function saveSucceeded(saveResult) {
                    log('Saved data successfully', saveResult, true);
                };

                function saveFailed(error) {
                    var msg = 'Save failed: ' + error.message;
                    logger.log(msg, error, system.getModuleId(datacontext), true);
                    error.message = msg;
                }
            }
        };
1
Sorry, not enough information, what does your client side code look like where you query for "GetAgency" and presumably modify it?Jay Traband
@JayTraband I will update my post. I didn't see the point of posting my client side code because its just an ajax request passing JSON to my service method. This part works as intended.nick gowdy

1 Answers

0
votes

You should be calling Breeze's EntityManager.saveChanges method. This will connect to a server side SaveChanges method that in turn makes use of Breeze's ContextProvider.SaveChanges method. In your code snippet, you are basically bypassing Breeze's entire save mechanism. The Breeze zip available on the Breeze web site contains a number of samples that show how this should be done.

On the client:

myEntityManager.saveChanges().then(saveSucceeded).fail(saveFailed);

On the server

[HttpPost]
public SaveResult SaveChanges(JObject saveBundle) {
    return ContextProvider.SaveChanges(saveBundle);
}