简体   繁体   中英

SubmitChanges not updating, but inserts new record. LINQ to SQL

I am having difficulties UPDATING the databes via LINQ to SQL, inserting a new record works fine.

The code correctly inserts a new row and adds a primary key, the issue I am having is when I go to update (chnage a value that is already in the database) that same row the database is not updating, it is the else part of the code that does not work correctly. This is strange b/c the DB is properly connected and functioning through the fact that the DataContext inserts a new row with no issues. Checking the database confirms this.

This is the code,

using System;
using System.Collections.Generic;
using System.Linq;

using Cost = Invoices.Tenant_Cost_TBL;

namespace Invoices
{   
    class CollectionGridEvents
    {
        static string conn = Settings.Default.Invoice_DbConnectionString;

        public static void CostDataGridCellEditing(DataGridRowEditEndingEventArgs e)
       {
        using (DatabaseDataContext DataContext = new DatabaseDataContext(conn))
           {
                var sDselectedRow = e.Row.Item as Cost;                
                if (sDselectedRow == null) return;
                if (sDselectedRow.ID == 0)
                {
                    sDselectedRow.ID = DateTime.UtcNow.Ticks;
                    DataContext.Tenant_Cost_TBLs.InsertOnSubmit(sDselectedRow);
                }
                else
                {
                    // these two lines are just for debuging
                    long lineToUpdateID = 636154619329526649; // this is the line to be updated primary key
                    long id = sDselectedRow.ID;     // this is to check the primary key on selected line is same

                    // these 3 lines are to ensure I am entering actual data into the DB
                    int? amount = sDselectedRow.Cost_Amount;
                    string name = sDselectedRow.Cost_Name;
                    int? quantity = sDselectedRow.Cost_Quantity;

                    sDselectedRow.Cost_Amount = amount;
                    sDselectedRow.Cost_Name = name;
                    sDselectedRow.Cost_Quantity = quantity;
                }
                try
                {                   
                    DataContext.SubmitChanges();
                }
                catch (Exception ex)
                {
                    Alert.Error("Did not save", "Error", ex);
                }
            }            
        }
    } 
}

And I am calling the method from this,

private void CostDataGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
    {
        CollectionGridEvents.CostDataGridCellEditing(e);
    }

The lineToUpdateID is copied dirrectly from the database and is just there to check against the currently selected rows primary key is the same, so I know I am trying to update the same row.

I have looked through as many of the same type of issues here on SO , such as this one Linq-to-Sql SubmitChanges not updating fields … why? . But still no closer to finding out what is going wrong.

Any ideas would be much appreciated.

EDIT: Cost is just short hand of this using Cost = Invoices.Tenant_Cost_TBL;

You cannot do that. You need to get the record out of the database and then update that record. Then save it back. Like this:

else
{
    // first get it
    var query =
        from ord in DataContext.Tenant_Cost_TBLs
        where ord.lineToUpdateID = 636154619329526649
        select ord;

    // then update it
    // Most likely you will have one record here
    foreach (Tenant_Cost_TBLs ord in query)
    {
        ord.Cost_Amount = sDselectedRow.Cost_Amount;
        // ... and the rest
        // Insert any additional changes to column values.
    }

}
try
{
    DataContext.SubmitChanges();
}
catch (Exception ex)
{
    Alert.Error("Did not save", "Error", ex);
}

Here is an example you can follow.

Or you can use a direct query if you do not want to select first.

DataContext.ExecuteCommand("update Tenant_Cost_TBLs set Cost_Amount =0 where ...", null);

Your object (Cost) is not attached to DB context. You should attach it then save changes. Check solution here

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