2009-06-08 5 views
0

J'utilise linq to sql dans ma couche de données où j'ai ajouté une table "settings" à la table asp_user habituelle. Dans cette table de paramètres, je garde plusieurs enregistrements dont l'un est l'unité préférée (une clé étrangère à la table Unités).La mise à jour Linq to Sql crée un enregistrement en double

Maintenant, lorsque cette unité préférée doit changer (disons de litre en kilogramme), je fais un appel à mon UnitService pour obtenir l'instance d'unité correcte et définir mon paramètre.PréféréUnit à cette instance. Cela crée un nouvel élément (en double) dans la base de données (il y a maintenant deux enregistrements kilogrammes dans ma table Unités). Ce n'est bien sûr pas ce que j'avais prévu.

J'ai le sentiment que je fais un tas de choses fondamentales mal

UserSetting setting = AccountService.GetUserSetting(user.Identity.Name); 
if (setting.PreferedUnitId != unitId) 
    setting.Unit = UnitService.GetUnitById(unitId); 
AccountService.SaveuserSetting(setting); 

Répondre

1

Vous devez probablement faire un DataContext.Units. Attach (unité) pour indiquer à Linq to SQL que votre objet unité existe déjà et n'a pas besoin d'être inséré. Notez que je suppose que votre table Units est exposée en tant que propriété Units sur le DataContext.

Je spécule ici, mais il semble que votre AccountService utilise un DataContext différent pour votre UnitService, donc vous êtes dans le scénario des objets déconnectés. Ce blog post pourrait rendre les choses un peu plus claires

+0

Oui, vous avez raison. Ça va probablement le réparer. –

1

Qu'est-AccountService.SaveuserSetting faire? Il fait probablement un inutile InsertOnSubmit.

+0

Oui, est-ce implicite? Alors que se passe-t-il si je décide que mes modifications doivent être annulées et que je ne devrais pas m'engager? –

Questions connexes