简体   繁体   中英

linq to sql c#: SubmitChanges() not updating the database

The method below that updates the database is called UpdateHold(). This instance of the object uses the second constructor. I ran debug to verify that the hold object "thisHold" is updating the values that are being changed in the form. But when I view the values of the db object after the submit happens, I see it is unchanged, same in the physical database. Why isn't this updating?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Data.Linq;
using System.Text;
using System.Windows.Forms;

namespace Coke_Hold_Database
{
    public partial class frmFGHold : Form
    {
        private PINAuthentication cert = new PINAuthentication();
        linqCokeDBDataContext db = new linqCokeDBDataContext();
        Record_HoldData thisHold;
        bool isNew; //flag if hold is new or not


        public frmFGHold()
        {
            //constructor for new hold
            InitializeComponent();
            populateLists();
            thisHold = new Record_HoldData();

            isNew = true;
            btnEdit.Visible = false;
        }

        public frmFGHold(Record_HoldData holdData)
        {
            //constructor for existing hold (edit)
            InitializeComponent();
            populateLists();
            this.thisHold = holdData;

            //fill out the form
            FillForm();

            isNew = false;
            btnEdit.Visible = true;
        }

        private void FillForm()
        {
            //fill out the form with existing information

            txtPONumber.Text = thisHold.PO_.ToString();
            cboProductionSupervisor.SelectedValue = thisHold.ProductionSupervisor;
            cboLineNumber.SelectedValue = thisHold.LineNumber;
            cboQASupervisor.SelectedValue = thisHold.QASupervisor;
            cboFlavorName.SelectedValue = thisHold.Flavor;
            cboContainer.Text = thisHold.ContainerType;
            cboContainerSize.Text = thisHold.ProductSize;
            cboPackage.Text = thisHold.Package;
            txtQuantity.Text = thisHold.HoldQty.ToString();
            mtbDateCode.Text = thisHold.DateCode;
            cboDefectiveComponent.Text = thisHold.NonConformingItem;
            cboDefectReason.Text = thisHold.NonConformance;
            cboOccuredAt.Text = thisHold.FoundDuring;
            chkTestRequired.Checked = (bool) thisHold.TestRequired;
            txaDescription.Text = thisHold.Comments;
            txaRootCauseAnalysis.Text = thisHold.RootCause;
        }

        private void UpdateHoldObject()
        {
            thisHold.PO_ = int.Parse(txtPONumber.Text);
            thisHold.ProductionSupervisor = (int)cboProductionSupervisor.SelectedValue;
            thisHold.LineNumber = (int) cboLineNumber.SelectedValue;
            thisHold.QASupervisor = (int) cboQASupervisor.SelectedValue;
            thisHold.Flavor = (int) cboFlavorName.SelectedValue;
            thisHold.ContainerType = cboContainer.Text;
            thisHold.ProductSize = cboContainerSize.Text;
            thisHold.Package = cboPackage.Text;
            thisHold.HoldQty = int.Parse(txtQuantity.Text);
            thisHold.DateCode = mtbDateCode.Text;
            thisHold.NonConformingItem = cboDefectiveComponent.Text;
            thisHold.NonConformance = cboDefectReason.Text;
            thisHold.FoundDuring = cboOccuredAt.Text;
            thisHold.TestRequired = chkTestRequired.Checked;
            thisHold.Comments = txaDescription.Text;
            thisHold.RootCause = txaRootCauseAnalysis.Text;
        }

        private void CreateNewHold()
        {
            db.Record_HoldDatas.InsertOnSubmit(thisHold);
            //GenerateHoldNumber()
            db.SubmitChanges();
            MessageBox.Show(this, "Hold submitted!\n\nYou're hold number is " + thisHold.HoldID.ToString(),"Hold #" + thisHold.HoldID.ToString() + " created", MessageBoxButtons.OK, MessageBoxIcon.Information);
            this.Close();
        }

        private void UpdateHold()
        {
            db.SubmitChanges();
            MessageBox.Show(this, "Hold #" + thisHold.HoldID.ToString() + " updated.", thisHold.HoldID.ToString() + " updated", MessageBoxButtons.OK, MessageBoxIcon.Information);
            this.Close();   
        }

        private bool ValidateEntry()
        {
            //TODO write some frakkin validation
            return true;
        }

        private void GetPIN()
        {
            frmPINPrompt pin = new frmPINPrompt(cert);
            pin.ShowDialog();
        }

        private void SubmitData()
        {
            UpdateHoldObject();
            GetPIN();

            if (ValidateEntry() && cert.authenticated)
            {
                try
                {
                    if (isNew)
                    {
                        thisHold.LabTech = cert.empNumber;
                        thisHold.LastEditBy = cert.empNumber;
                        thisHold.HoldStatus = "Open";
                        thisHold.DateOpened = DateTime.Now;
                        thisHold.LastEditDate = DateTime.Now;

                        CreateNewHold();
                    }
                    else
                    {
                        thisHold.LastEditBy = cert.empNumber;
                        thisHold.LastEditDate = DateTime.Now;

                        UpdateHold();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        public void populateLists()
        {
            //load production names
            var productionNames =
                from a in db.LUT_Employees
                where a.position == "Supervisor" && a.department == "Production"
                select new { ID = a.ID, Names = a.lastName + ", " + a.firstName };

            cboProductionSupervisor.DataSource = productionNames;
            cboProductionSupervisor.DisplayMember = "Names";
            cboProductionSupervisor.ValueMember = "ID";

            //load QA names
            var qaNames =
                from a in db.LUT_Employees
                where a.position == "Supervisor" && a.department == "Quality Assurance"
                select new { ID = a.ID, Names = a.lastName + ", " + a.firstName };

            cboQASupervisor.DataSource = qaNames;
            cboQASupervisor.DisplayMember = "Names";
            cboQASupervisor.ValueMember = "ID";

            //load flavor names
            var flavorNames =
                from a in db.LUT_Flavors
                select new { ID = a.ID, Flavor = a.flavor };

            cboFlavorName.DataSource = flavorNames;
            cboFlavorName.DisplayMember = "flavor";
            cboFlavorName.ValueMember = "ID";

            //load line numbers
            var lineNumbers =
                (from a in db.LUT_ProductionLines
                select new { a.lineNumber }).ToList();

            cboLineNumber.DataSource = lineNumbers; 
            cboLineNumber.DisplayMember = "LineNumber";
            cboLineNumber.ValueMember = "LineNumber";
        }

        private void mtbDateCode_MouseUp(object sender, MouseEventArgs e)
        {
            SendKeys.Send("{HOME}");
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show("Are you sure you want to cancel? All data will be lost!", "Confirm Cancel", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
            if (result == DialogResult.Yes)
            {
                this.Close();
            }
            else { }
        }





        private void btnSubmit_Click(object sender, EventArgs e)
        {
            SubmitData();

        }

        private void linkAutoFill_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            //autogenerage date code
            mtbDateCode.Text = Etc.BuildDateCode(DateTime.Now,(int)cboFlavorName.SelectedValue,cboContainer.Text,Etc.getDayCode(DateTime.Now),int.Parse(cboLineNumber.Text));
        }

        private void cboContainerSize_SelectedIndexChanged(object sender, EventArgs e)
        {
            //load package sizes
            var packageSizes =
                from a in db.LUT_Packagings
                where a.Container == cboContainer.Text && a.Size == cboContainerSize.SelectedValue
                select new { ID = a.ID, Size = a.Package };

            cboPackage.DataSource = packageSizes;
            cboPackage.DisplayMember = "Size";
            cboPackage.ValueMember = "ID";

        }

        private void cboContainer_SelectedIndexChanged(object sender, EventArgs e)
        {
            //make container size list
            var containerSizes =
                from a in db.LUT_Containers
                where a.ContainerType == cboContainer.Text
                select new { ID = a.ID, Size = a.size };

            cboContainerSize.DataSource = containerSizes;
            cboContainerSize.DisplayMember = "Size";
            cboContainerSize.ValueMember = "ID";

            //load components
            var defectiveComponents =
                from a in db.LUT_ContainerComponents
                where a.Container == cboContainer.Text
                select new { ID = a.ID, Comp = a.Component };

            cboDefectiveComponent.DataSource = defectiveComponents;
            cboDefectiveComponent.DisplayMember = "Comp";
            cboDefectiveComponent.ValueMember = "ID";
        }

        private void btnEdit_Click(object sender, EventArgs e)
        {
            //TODO ask verify PIN
            foreach (Control c in this.Controls)
            {
                c.Enabled = true;
            }

            btnSubmit.Text = "Update Hold";
        }
    }
}

The database is not updated, because you're submitting changes on the db DataContext, and the 'hold' you've provided through the constructor is not attached to that DataContext. Therefore, the db DataContext cannot track the changes you've made to the object.

You could try using DataContext.Attach or, even better, supply the form with the original data context the object was loaded from.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM