Linq to Sql SubmitChanges没有保存到基础表

时间:2012-07-30 13:24:50

标签: c# linq linq-to-sql

我有一个代码:

        MyDataClassesDataContext dc = new MyDataClassesDataContext();
        Table<FormsAuthorisation> databaseAuthorisation = GetFormsAuthorisation();
        Table<ADForm> databaseForms = GetADForm();

        foreach (var auth in authorisation)
        {
            var databaseAuth = databaseAuthorisation.Where(p => p.GroupID == auth.GroupID && p.FormID == auth.FormID).FirstOrDefault();

            databaseAuth.CanRead = auth.CanRead;
            databaseAuth.CanWrite = auth.CanWrite;
            dc.SubmitChanges();

        }

        foreach (var form in forms)
        {
            var databaseForm = databaseForms.Where(p => p.FormID == form.FormID).FirstOrDefault();
            databaseForm.FormDescription = form.FormDescription;
            dc.SubmitChanges();

        }

        dc.SubmitChanges();

此代码根本不保存任何更新的值。

我已经谷歌搜索了很长时间但没有很好的结果

我的所有表都定义了主键。

1 个答案:

答案 0 :(得分:2)

我想说这很简单,因为你从不同的数据上下文(通过databaseAuthorisation方法)中提取GetFormsAuthorisation。您实际上并未对dc进行任何更改。因此,当您提交更改时,上下文不会进行任何更改。

同样适用于databaseForms

选项是您可以重载方法以允许传递和使用dc数据上下文。或者,您可以在此代码块中复制方法的功能。显然,如果方法应用任何合理数量的逻辑,复制并不理想。

例如:

public Table<FormsAuthorisation> GetFormsAuthorisation()
{
    MyDataClassesDataContext dc = new MyDataClassesDataContext();
    return GetFormsAuthorisation(dc);
}

public Table<FormsAuthorisation> GetFormsAuthorisation(MyDataClassesDataContext dc)
{
    //do whatever you already do inside your GetFormsAuthorisation function using dc parameter
}

现在,你仍然可以使用没有param的函数进行只读执行(例如查看记录),你可以使用重载版本来修改记录:

MyDataClassesDataContext dc = new MyDataClassesDataContext();
Table<FormsAuthorisation> databaseAuthorisation = GetFormsAuthorisation(dc);
//make any changes
dc.SubmitChanges();