Binary フィールドを null に設定しようとすると、ArgumentNull 例外が発生します。このようにフィールドを空に設定できますnew Binary(new byte[] {});が、それはnullではなく、空の列です。LinqToSql を使用した回避策はありますか?
4 に答える
何か他のことが起こっています。ID (ID)、null 許容 varbinary(MAX)、null 非許容 varbinary(MAX)、およびタイムスタンプを持つ小さなサンプル テーブルを作成しました。次のコードを使用すると、エラーなく正常に動作します。
using (var context = new TestDataContext())
{
var binarySample = new BinarySample
{
Image = null,
NonNullImage = new Binary( new byte[0] ),
};
context.BinarySamples.InsertOnSubmit( binarySample );
context.SubmitChanges();
}
このコードは、ArgumentNullException ではなく、SQLException を適切にスロー (およびキャッチ) します。
try
{
using (var context = new TestDataContext())
{
var binarySample2 = new BinarySample
{
NonNullImage = null,
Image = new Binary( new byte[0] )
};
context.BinarySamples.InsertOnSubmit( binarySample2 );
context.SubmitChanges();
}
}
catch (SqlException e)
{
Console.WriteLine( e.Message );
}
ArgumentNullException をスローしているプロパティの SendPropertyChanging ハンドラーを持つ部分クラス実装がある可能性はありますか?
編集:OPのコメントに基づいています。
byte[] 型の変数を Binary に直接割り当てることはできないことに注意してください。これは、暗黙的な変換操作を呼び出し、暗黙的な変換によって ArgumentNullException がスローされるためです。値を割り当てる前に値が null かどうかを確認し、byte[] 変数が null の場合は単に null を割り当てる必要があります。私には、これは奇妙な振る舞いのように思えます。将来的には変更されることを願っています。MSDN ドキュメントは、将来のバージョンで何らかの変更が発生する可能性があることを示しています。
@tvanfosson(コードのフォーマットを改善するための回答として投稿)
はい、そうです、何か奇妙なことが起こっています。私の C# の知識を超えています。
from.ImageThumbnail は byte[] to.ImageThumbnail は Binary
? の使用 また ??if else it works を使用するだけでは、演算子は機能しません。理由がわかりません:-)
if (from.ImageThumbnail != null) // works
{
to.ImageThumbnail = from.ImageThumbnail;
}
else
{
to.ImageThumbnail = null;
}
to.ImageThumbnail = from.ImageThumbnail != null ? from.ImageThumbnail : null; // fails
to.ImageThumbnail = from.ImageThumbnail ?? null; // fails
フィールドがデータベースで null 可能であると確信していますか? linq データ モデルはそれに応じて更新されていますか? 属性ベースのマッピングを使用する場合CanBeNull=trueは、属性に設定が必要[Column(...)]です。
ExecuteQuery()メソッドを使用して、独自の SQL を渡すことができます。