2010-04-14 1 views
5

Je reçois l'erreur suivante dans mon application MVC2 en utilisant Linq to SQL (je suis nouveau dans les deux). Je suis connecté à un serveur SQL réel pas étrange mdf:La valeur null ne peut pas être affectée à un membre avec le type System.Int64 qui est un type de valeur non nullable

System.InvalidOperationException The null value cannot be assigned to a member with type System.Int64 which is a non-nullable value type 

Ma table SQL a une colonne appelée MessageID. Il est de type BigInt et dispose d'une clé primaire, NOT NULL et une identité 1 1, aucun défaut

Dans mon concepteur dbml il a la déclaration suivante pour ce champ:

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_MessageId", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)] 
public long MessageId 
{ 
    get 
    { 
     return this._MessageId; 
    } 
    set 
    { 
     if ((this._MessageId != value)) 
     { 
      this.OnMessageIdChanging(value); 
      this.SendPropertyChanging(); 
      this._MessageId = value; 
      this.SendPropertyChanged("MessageId"); 
      this.OnMessageIdChanged(); 
     } 
    } 
} 

Il continue à me dire que nulle ne peut pas être assigné - je ne passe pas par null! C'est long - ça ne peut même pas être nul!

Est-ce que je fais quelque chose de stupide? Je ne trouve pas de solution nulle part!

J'ai fait ce travail en changeant le type de cette propriété à Nullable<long> mais sûrement cela ne peut pas être vrai?

Mise à jour: J'utilise InsertOnSubmit. Code simplifié:

public ActionResult Create(Message message) 
{ 
    if (ModelState.IsValid) 
    { 
     var db = new MessagingDataContext(); 
     db.Messages.InsertOnSubmit(message); 
     db.SubmitChanges(); //line 93 (where it breaks) 
    } 
} 

casse sur SubmitChanges() avec l'erreur en haut de cette question.

Update2: Trace de la pile:

at Read_Object(ObjectMaterializer`1) 
    at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicInsert(TrackedObject item) 
    at System.Data.Linq.ChangeDirector.StandardChangeDirector.Insert(TrackedObject item) 
    at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) 
    at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 
    at Qanda.Controllers.MessagingController.Ask(Message message) in C:\Qanda\Qanda\Controllers\MessagingController.cs:line 93 

Update3: Personne ne sait et je n'ai pas assez d'influence pour offrir une prime! Donc continué sur mon ASP.NET blog. S'il vous plaît aider!

+0

Essayez-vous d'utiliser la méthode InsertOnSubmit et cela entraîne-t-il cette exception? – Raja

+0

pouvez-vous afficher le code qui provoque l'erreur? – Geoff

+0

merci. J'ai mis à jour ma question – BritishDeveloper

Répondre

6

Il a fallu un certain temps, mais j'ai découvert ce qui se passait et pensé que je partage. C'était parce que la table avait une gâchette sur insert. Je l'ai écrit à ce sujet plus en détail ici optimistic concurrency exception with triggers. Bien que ce soit avec cadre d'entité, je suis toujours sûr que c'est le déclencheur provoquant ma consternation depuis le début

+1

+1 Merci pour votre blogage. C'était la seule référence que je pouvais trouver après avoir gaspillé deux heures de débogage inutile. Je suis de retour à ADO.Net pour celui-ci. – Laramie

+1

+1 pour moi aussi, sauf le mien est System.Int32 (type de données de colonne d'identité est INT); avait également un déclencheur 'INSTEAD OF INSERT'. Le problème sous-jacent est que 'SCOPE_IDENTITY()' renvoie 'NULL' quand le trigger est actif (cela me semble être un bug); l'ancienne valeur non recommandée '@@ IDENTITY' est correcte. – devstuff

+0

BTW, c'est un problème connu: http://connect.microsoft.com/SQLServer/feedback/details/427640/instead-trigger-break-the-scope-identity-scope – devstuff

2

Les types de valeur que vous avez définis dans votre classe Result doivent être configurés comme nullable.

Dans votre cas, utilisez int64?

Vérifiez le code objet dans votre fichier designer.cs qui a été généré par le concepteur, si vous l'utilisez.

Modifiez ce code et placez-le dans une classe partielle pour que le concepteur ne sur-écrase pas le code.

+0

ou simplement le définir dans les propriétés dbml: nullable = false. D'accord, cela fonctionne mais pourquoi devrait-il être nul? J'ai remarqué que cela corrige, mais je voulais être sûr que c'est la bonne chose à faire. pas seulement un hack – BritishDeveloper

+0

Les types de valeur ne peuvent pas être null, les champs de base de données renvoient des valeurs nulles, quand ils sont passés, ils vont lancer une exception. En définissant la variable type de valeur sur nullable, les types de valeur peuvent accepter des valeurs nulles. –

0

J'ai eu ce problème en appelant une procédure stockée retournant des données de 3 tables avec jointure externe gauche le problème était qu'une colonne avec Type de Bigint était Null Donc j'ai appliqué ISNULL (OID, 0) dans la procédure à surmonter dans LINQ

0

Vérifiez d'abord quelle colonne est cause d'exception puis définissez sa valeur par défaut dans le tableau ou le modèle EF si vous l'utilisez.

Si vous n'enregistrez rien pour cette colonne, elle sera stockée avec la valeur par défaut et cette erreur ne se reproduira plus jamais.

Questions connexes