SubmitChanges不更新,但插入新记录。 LINQ to SQL

时间:2016-11-23 02:21:22

标签: c# linq

我在通过LINQ to SQL更新数据库时遇到困难,插入新记录工作正常。

代码正确插入一个新行并添加一个主键,我遇到的问题是当我去更新(chnage一个已经在数据库中的值)数据库没有更新的同一行时,它是否则部分代码无法正常工作。这是奇怪的b / c数据库正确连接并通过DataContext插入一个没有问题的新行这一事实起作用。检查数据库确认了这一点。

这是代码,

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);
                }
            }            
        }
    } 
}

我正在调用这个方法,

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

lineToUpdateID是从数据库中直接复制的,只是检查当前选中的行主键是否相同,所以我知道我正在尝试更新同一行。

我已经在SO上查看了很多相同类型的问题,例如Linq-to-Sql SubmitChanges not updating fields … why?。但仍然没有找到出错的地方。

非常感谢任何想法。

编辑:Cost只是此using Cost = Invoices.Tenant_Cost_TBL;

的简写

2 个答案:

答案 0 :(得分:1)

你做不到。您需要从数据库中获取记录,然后更新该记录。然后保存回来。像这样:

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是您可以遵循的示例。

如果您不想先选择,也可以使用直接查询。

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

答案 1 :(得分:1)

您的对象(成本)未附加到数据库上下文。您应该附加它然后保存更改。 Check solution here