3

tblOvrdImpVolsType両方ともヌル可能である 2 つの外部キー列で呼び出されるテーブルがあります。この行の外部キー列の 1 つが null の場合、Linq-To-SQL を使用してこのテーブルの行を削除するのに問題があります。これが私のコードです:

using (Databases.Global db = new Databases.Global())
{
    db.Log = Console.Out;
    var records = from iv in db.tblOvrdImpVolsType
                    join sm in db.tblSecurityMasterType 
                       on iv.FkSecurity equals sm.PkSecurity
                    where sm.Name == name
                    select iv; //returns only 1 record

    db.tblOvrdImpVolsType.DeleteAllOnSubmit<MyTableType>(records);

    int numDeletes = db.GetChangeSet().Deletes.Count; // = 1
    db.SubmitChanges(); //deletes 0 records
}
  • Databases.Global は DataContext から継承し、私が使用するテーブルを持っています。

  • tblOvrdImpVolsType には 2 つの null 許容の外部キー列 (key1 と key2) があります。

  • 関心のある行にはこれらのキー値があります (key1 = 9898、key2 = null)

  • 私の C# コードでは、key1 と key2 のデータ型は両方int?ともCanBeNull = true

  • GetChangeSet()、1 つのレコードが削除されることを示していますが、データベースを確認すると、その行は明らかに削除されていません。

  • 例外はスローされません。

DataContext が生成する SQL は次のとおりです。

DELETE FROM [tblOvrdImpVols] WHERE ([key1] = @p0) AND ([key2] = @p1)
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [9898]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [Null]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.17929

[key2] = @p1問題はその部分だと思います。気になるkey2の値がnullなので、SQLが悪いです。以下の SQL クエリは、これを示しています。唯一の違いは、条件のis対です。=key2

select * FROM [tblOvrdImpVols] WHERE ([key1] = 9898) AND ([key2] is null)
    --returns 1 row

select * FROM [tblOvrdImpVols] WHERE ([key1] = 9898) AND ([key2] = null)
    --returns 0 rows

私は何を間違っていますか?=DataContext オブジェクトを取得しisて null 値を置き換えることができれば、削除が機能すると思います。私はそれを行う方法がわかりません。また、この質問は以前に尋ねられたと思いますが、見つかりません。

編集:私はもともと自分のキーを「外部」ではなく「プライマリ」と呼んでいました。「外国人」と言いたい。代わりに「外国人」と言うように投稿を編集しました。私はまだ同じ問題を抱えています。

4

2 に答える 2