2010-03-24 3 views
4

Si vous tentez de définir un champ binaire sur null, cela me donne une exception ArgumentNull. Je peux définir le champ pour être vide comme ceci new Binary(new byte[] {}); mais ce n'est pas nul juste une colonne vide. Existe-t-il une solution de contournement utilisant LinqToSql?Définir Linq To Sql Champ binaire sur null

Répondre

5

Vous avez autre chose à faire. Je viens de créer un petit exemple de table avec un id (identité), un varbinary (MAX), un varbinary (MAX) non-nullable, et un timestamp. L'utilisation du code suivant fonctionne très bien sans erreurs. Où que ce code jette (et attrape) correctement une exception SQLException, pas une exception ArgumentNullException.

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

Est-il possible que vous avez une implémentation de la classe partielle qui a un gestionnaire SendPropertyChanging pour la propriété qui jette le ArgumentNullException?

EDIT: basé sur le commentaire de l'OP.

Notez que vous ne pouvez pas affecter directement une variable de type byte [] au binaire, car elle appelle implicit conversion operation et la conversion implicite lancera une exception ArgumentNullException. Vous devriez vérifier si la valeur est null avant d'essayer de l'assigner et simplement assigner null si la variable byte [] est nulle. Pour moi, cela semble être un comportement étrange et j'espère qu'ils le changeront dans le futur. La documentation MSDN indique que certaines modifications peuvent se produire dans les versions futures.

+0

J'ai posté mon commentaire comme réponse pour obtenir un meilleur formatage du code, voir ci-dessous – Karsten

1

Etes-vous sûr que le champ est nullable dans la base de données? Le modèle de données linq est-il mis à jour en conséquence? Si vous utilisez un mappage basé sur des attributs, il doit y avoir un paramètre CanBeNull=true dans l'attribut [Column(...)].

+0

Bon point, même si elle n'a pas été définie comme une colonne nullable lorsque vous avez ajouté la table au concepteur de Linq2SQL, vous devrez supprimer la table du concepteur et 'rajoutez-le' pour que le schéma mis à jour change. – Nate

+0

Oui bon point, la colonne était nullable bien – Karsten

1

@tvanfosson (affiché comme une réponse pour obtenir une meilleure mise en forme du code)

Oui, vous avez raison, quelque chose d'étrange se passe, quelque chose au-delà de ma connaissance C#.

from.ImageThumbnail est byte [] to.ImageThumbnail est binaire

Utilisation de la? ou ?? les opérateurs ne fonctionneront pas, si je l'utilise juste si ça marche, bizarre. Je ne vois pas pourquoi :-)

  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 
+1

Il y a un opérateur de conversion implicite de byte [] en binaire (http://msdn.microsoft. com/fr-fr/library/system.data.linq.binary.op_implicit.aspx) qui gère l'assignation. L'opération de conversion renvoie une exception dans le cas où l'argument est null. Ceci est effectivement noté dans la documentation pour l'opérateur. Stick avec la première version du code. – tvanfosson

+1

FYI - vous devriez probablement éditer votre question et ajouter cette information là, plutôt que dans une réponse séparée. Cela rendra votre question plus utile à ceux qui cherchent une solution au même problème. – tvanfosson

+0

Je vois, merci pour l'info – Karsten