0

私はコードをもっている:

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

このコードは、更新された値をまったく保存していません。

私はそれを長い間グーグルで検索しましたが、良い結果はありません

すべてのテーブルに主キーが定義されています。

4

1 に答える 1

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
}

これで、読み取り専用の実行 (例: レコードの表示) にパラメーターなしで関数を引き続き使用でき、オーバーロードされたバージョンを使用してレコードの変更を許可できます。

MyDataClassesDataContext dc = new MyDataClassesDataContext();
Table<FormsAuthorisation> databaseAuthorisation = GetFormsAuthorisation(dc);
//make any changes
dc.SubmitChanges();
于 2012-07-30T13:27:46.753 に答える