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 値を置き換えることができれば、削除が機能すると思います。私はそれを行う方法がわかりません。また、この質問は以前に尋ねられたと思いますが、見つかりません。
編集:私はもともと自分のキーを「外部」ではなく「プライマリ」と呼んでいました。「外国人」と言いたい。代わりに「外国人」と言うように投稿を編集しました。私はまだ同じ問題を抱えています。