我遇到了C#中linq to DB实现提供的SubmitChanges函数的问题。当我运行该命令时,没有任何内容抛出错误,但记录永远不会更新。我已经查找了这个问题,几乎每个人都说它与桌子有问题,没有什么是主键。但是我的表有一个主键分配给它,但SubmitChanges没有发生。为了概述我正在执行的内容,我在这里是一个示例:
public void setApproval(string approvalCode, int ID)
{
using (DatabaseDataContext context = new DatabaseDataContext(DBConnection().getConnectionString()))
{
myRecord con = getRecord(ID); //Gets the record succesfully, PK field in tact
con.ApprovalStatus = approvalCode;
context.SubmitChanges();
}
}
如上所述,记录成功获取所有数据,包括用于识别它的PK字段。数据库连接用户有权更新表,但在这里我希望它能够破解并抱怨。
有什么想法吗?如果我没有提供足够的信息,请告诉我。非常感谢任何帮助!
答案 0 :(得分:5)
您应该通过上下文获取对象
public void setApproval(string approvalCode, int ID)
{
using (DatabaseDataContext context = new DatabaseDataContext(DBConnection().getConnectionString()))
{
myRecord con = context.TableName.First(item => item.ID == ID); //Gets the record succesfully, PK field in tact
con.ApprovalStatus = approvalCode;
context.SubmitChanges();
}
}
当您通过Context获取对象时,它会跟踪您所做的更改,然后将这些更改保存在SubmitChanges上
答案 1 :(得分:4)
getRecord(ID)在哪里获取其上下文以返回记录?它没有传递给方法,所以我假设它使用不同的上下文。 SubmitChanges()只会看到当前上下文的更改,而不会看到getRecord(ID)使用的上下文。
答案 2 :(得分:0)
您是在检查数据是使用代码还是使用独立的数据库工具进行更新?
如果在代码中,您的读取代码与写入代码一样可疑: 当两个没有通用API的应用程序通过数据库进行通信时,我遇到了类似的问题。上下文不是现在数据库中的内容的反映,并且没有任何告诉它刷新的数据将完全解决问题。如果需要检查数据库中是否有其他程序或线程输入的内容,则必须创建新的数据库上下文对象以检查数据库。在最近的更新之前,旧的数据库上下文对象可能仍然具有旧数据。
您的getRecord
函数需要创建新上下文或将您刚编辑的当前上下文作为参数。如果它使用静态或类级别上下文,则它将不具有最新数据。