2010-04-01 17 views
0

J'ai une question plus profonde concernant la fonctionnalité de débogage de Linq à Sql SubmitChanges() Fonction. Je souhaite enregistrer un enregistrement dans une table d'une base de données localement mise en cache (localdbcache: serveur SqlExpress 2008 client SqlCE). Avant d'appeler SubmitChanges, je peux trouver le nouvel élément via DataContext.GetChangeSet(). Après avoir appelé Submit Changes, les éléments à insérer ont été supprimés du ChangeSet. (C'est ce que cette fonction est supposée faire.) Il n'y a pas de changement de conflit et pas d'erreur dans la sortie du journal de la base de données. Aucune exception du tout. Le nombre de tables reste à la même valeur.SubmitChanges ne sauvegarde pas, mais supprime les insertions du jeu de modifications, sans erreurs

if ((e.Parameter == null) || 
    (!e.Parameter.GetType().Equals(typeof(LibDB.Client.Vehicles)))) 
{ 
    return; 
} 

LibDB.Client.Vehicles tmp = e.Parameter as LibDB.Client.Vehicles; 

try 
{ 
    ChangeSet cs = this._dc.GetChangeSet(); 

    if ((tmp == null) || (this._dc == null)) return; 

    if (this._dc.Vehicles.Where(veh => veh.Vin == tmp.Vin).Count() == 0) 
     this._dc.Vehicles.InsertOnSubmit(tmp); 
    else if (this._dc.Vehicles.Where(veh => veh.Vin == tmp.Vin).Count() == 1) 
     this._dc.Vehicles.Attach(tmp, true); 
    else 
     return; 

    using (TransactionScope ts = new TransactionScope()) 
    { 
     try 
     {       
      this._dc.SubmitChanges(); 
      //this._dc.Refresh(RefreshMode.OverwriteCurrentValues, 
      // this._dc.Vehicles); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

    if (this._dc.Vehicles.Where(veh => veh.Vin == tmp.Vin).Count() == 1) 
     MessageBox.Show("Vehicle not saved."); 

    this.vehSelector.ResetLayout(); 
} 

Je serais reconnaissant de toute l'aide que je suis perdre espoir de trouver une erreur, Merci à l'avance Winston

Répondre

0

Est-ce que votre entité a une clé primaire définie dans la db?

+0

Oui J'ai une clé primaire, c'est une clé primaire guidée manuellement sans définir l'association à "IsDbGenerated" car j'utilise un fichier XML de mappage. –

0

Vérifiez le nombre sur une nouvelle instance de _dc. Vous êtes censé le disposer après l'appel .SaveChanges()

Une autre façon d'isoler le problème est de regarder le compte sur la table elle-même, sans utiliser Linq.

+0

Eh bien, je ne travaille que sur une instance de mon Datacontext (_dc), donc les mises à jour fonctionnent habituellement avant et il n'est pas nécessaire de détacher les entités avant de les ajouter. Je n'utilise pas SaveChanges mais j'ai jeté un coup d'oeil au Count pendant le débogage (si vous appelez une méthode par "add watch" cette méthode est exécutée une fois, donc j'ai ajouté le this._dc.Vehicles.Count() Un avant, après avoir appelé SubmitChanges() –

+0

un DataContext est conçu pour être utilisé pour un seul ensemble d'actions, il est possible d'en supprimer quelques unes, de mettre à jour d'autres et d'insérer des objets, d'appeler SaveChanges. les changements vous devez disposer du contexte et en ouvrir un nouveau, c'est un objet bon marché qui ne devrait pas être gardé. –