【问题标题】:SubmitChanges not updating, but inserts new record. LINQ to SQLSubmitChanges 不更新,但插入新记录。 LINQ 到 SQL
【发布时间】:2016-11-23 02:21:21
【问题描述】:

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

代码正确插入了一个新行并添加了一个主键,我遇到的问题是当我去更新(更改数据库中已经存在的值)数据库没有更新的同一行时,它是else 部分代码不能正常工作。这很奇怪,因为 DataContext 插入了一个没有问题的新行,所以 DB 已正确连接并运行。检查数据库证实了这一点。

这是代码,

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; 的简写

【问题讨论】:

    标签: c# linq


    【解决方案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);
    

    【讨论】:

    • 对不起,我认为很明显数据 Cost 是我从数据库获取的记录的一部分,因为插入行确实有效。还是我误会你了?请查看更新的问题以进行编辑。
    • Linq to SQL 不支持这样的更新。您需要首先从数据库中获取该记录,然后更新该记录并保存它。现在,当您创建 DatabaseDataContext 时,您不会将其从数据库中取出。
    • 好的我明白你在说什么,但是我不明白为什么如果它没有连接到数据库,它会正确插入记录?
    • 这样想,你的DataContext就是你刚刚创建的内存中的一个对象。该对象没有您的项目“成本”,因此您需要从数据库中获取它,然后它将成为 DataContext 对象的一部分。然后你更新它并保存它。上次从数据库中取出的时候,那个DataContext是一个不同的对象,如果你只是将它添加到DataContext中,它就会被视为一个新添加的对象。另外,在你的 else 块中,除了将 a 分配给 b 然后将 b 分配给 a 之外,你并没有真正做任何事情......你知道我的意思
    • 好的,这不起作用,因为var query = from ord in DataContext.Tenant_Cost_TBLs where ord.ID = 636154619329526649 select ord; 中的Ord.ID 在数据库中是long 时被视为bool。一些时髦的事情正在发生。为什么不使用using 语句那么简单却如此困难?
    【解决方案2】:

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

    【讨论】:

    • 对不起,我认为很明显数据 Cost 是我从数据库中获取的记录的一部分,因为插入行确实有效。还是我误会你了?请查看更新的问题以进行编辑。
    • 您正在尝试将更改保存到刚刚创建的从另一个上下文(目前不存在)获得的对象的 DataContext。因此,您应该在保存更改之前将对象附加到 DataContext。
    • 感谢您的帮助,我投了赞成票。这对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多