قم بتعيين LINQ على SQL Binary Field على NULL
-
22-09-2019 - |
سؤال
محاولة تعيين حقل ثنائي على NULL يعطيني استثناء agbumentnull. يمكنني ضبط الحقل ليكون فارغًا مثل هذا new Binary(new byte[] {});
لكن هذا ليس مجرد عمود فارغ. هل هناك حل بديل باستخدام linqtoSql؟
المحلول
لديك شيء آخر يحدث. لقد قمت للتو بإنشاء جدول عينة صغير مع معرف (هوية) ، فارس غير مألوف (MAX) ، 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();
}
حيث يرمي هذا الرمز بشكل صحيح (ويمسك) sqlexception ، وليس engumentNullexception.
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 );
}
هل من الممكن أن يكون لديك تطبيق فئة جزئي يحتوي على معالج sendPropertyChanging للعقار الذي يرمي engumentnullexception؟
تعديل: بناءً على تعليق البروتوكول الاختياري.
لاحظ أنه لا يمكنك تعيين متغير من النوع بايت [] إلى الثنائي مباشرة حيث يستدعي عملية التحويل الضمنية والتحويل الضمني سوف يرمي engumentnullexception. يجب عليك التحقق مما إذا كانت القيمة لاغية قبل محاولة تعيينها وببساطة تخصيص NULL إذا كان المتغير البايت [] فارغًا. بالنسبة لي هذا يبدو وكأنه سلوك غريب وآمل أن يغيروه في المستقبل. تشير وثائق MSDN إلى أن بعض التغيير قد يحدث في الإصدارات المستقبلية.
نصائح أخرى
هل أنت متأكد من أن الحقل غير قابل للإلغاء في قاعدة البيانات؟ هل تم تحديث نموذج بيانات LINQ وفقًا لذلك؟ إذا كنت تستخدم رسم الخرائط المستندة إلى السمة ، فيجب أن يكون هناك ملف CanBeNull=true
الإعداد في [Column(...)]
ينسب.
tvanfosson (تم نشره كإجابة للحصول على تنسيق أفضل للرمز)
نعم أنت على حق ، شيء غريب يحدث ، شيء يتجاوز معرفتي C#.
From.ImageThumbnail هو Byte [] to.imageThumbnail
باستخدام ؟ أو ؟؟ لن يعمل المشغلون ، إذا استخدمت فقط إذا كان يعمل ، غريبًا. لا أرى لماذا :-)
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
يمكنك استخدام تنفيذ الاستعلام() طريقة لتمرير SQL الخاص بك.