2008-12-16 8 views
4

Normalement, lorsque vous mettez à jour un objet dans linq2sql, vous obtenez l'objet d'un datacontext et utilisez le même datacontext pour enregistrer l'objet, n'est-ce pas? Quelle est la meilleure façon de mettre à jour un objet qui n'a pas été récupéré par le datacontext que vous utilisez pour effectuer l'opération de sauvegarde, c'est-à-dire que j'utilise flourinefx pour transmettre des données entre flex et asp.net le client à sauver je ne sais pas comment sauver l'objet?Linq2SQL: Objet de mise à jour non créé dans datacontext

public static void Save(Client client) 
    { 
     CompanyDataContext db = new CompanyDataContext(); 
     Validate(client); 
     if(client.Id.Equals(Guid.Empty)) 
     { 
      //Create (right?): 
      client.Id = Guid.NewGuid(); 
      db.Clients.InsertOnSubmit(client); 
      db.SubmitChanges(); 
     } 
     else 
     { 
      //Update: 
      OffertaDataContext db = new OffertaDataContext(); 
      db.Clients.???? 

     } 
    } 

Mise à jour: différentes approches d'utilisation Joindre le travail de doens't dans ce cas. Donc je suppose qu'une approche basée sur la réflexion est nécessaire.

Répondre

6

Pour mettre à jour un objet existant mais déconnecté, vous devez le "rattacher" au contexte de données. Cela permettra de réutiliser la clé primaire existante, etc. Vous pouvez contrôler la façon de gérer les changements, c'est-à-dire les traiter comme sales ou les traiter comme des nettoyages futurs.

La méthode Attacher est sur la table - ie

ctx.Customers.Attach(customer); // optional bool to treat as modified 
+2

+1, aussi. le « option bool pour traiter comme modifié 'ne fonctionne que s'il y a un champ TimeStamp ou vous spécifiez de ne pas vérifier les mises à jour dans le DBML.J'utilise une autre solution ici: http://www.singingeels.com/Blogs/Nullable/2009/01/09/How_to_Make_LINQ_to_SQL_Check_for_Changes_After_Attach_or_AttachAll . aspx –

4

Je pense que vous avez 2 options:

1) Fixez l'objet DataContext sur lequel vous ferez votre sauvegarde 2) En utilisant la clé primaire sur votre objet, saisir une instance qui est attaché à votre contexte (par exemple, faire un FirstOrDefault()), puis copier les données de l'objet modifié à l'objet qui a un contexte (réflexion pourrait être utile ici).

Rick Strahl a un très bon article de blog sur l'attachement d'entités à un contexte au http://www.west-wind.com/weblog/posts/134095.aspx, particulièrement en ce qui concerne certains des problèmes que vous pourriez rencontrer.

0

J'espère que vous pouvez aider. Je développe un site Web à plusieurs niveaux en utilisant Linq to Sql. J'ai créé une nouvelle classe (ou objet) dans le concepteur DBML appelée memberState. Cet objet n'est pas une table réelle dans la base de données. J'ai cette méthode dans ma couche intermédiaire:

public override IEnumerable(memberState) GetMembersByState(string @state)<br/> 
{<br/> 
using (BulletinWizardDataContext context = DataContext)<br/> 
{<br/> 
IEnumerable(memberState) mems = (from m in context.Members<br/> 
join ma in context.MemberAddresses<br/> 
on m.UserId equals ma.UserId<br/> 
join s in context.States<br/> 
on ma.StateId equals s.StateId<br/> 
where s.StateName == @state<br/> 
select new memberState<br/> 
{<br/> 
userId = m.UserID,<br/> 
firstName = m.FirstName,<br/> 
middleInitial = m.MiddleInitial,<br/> 
lastName = m.LastName,<br/> 
createDate = m.CreateDate,<br/> 
modifyDate = m.ModifyDate<br/> 
}).ToArray(memberState)();<br/> 
return mems; 
} 
} 

Les tableaux dans mon joint (Membres, les États et MemberAddresses sont des tableaux réels dans ma base de données). J'ai créé l'objet memberStates pour que je puisse l'utiliser dans la requête ci-dessus (notez le Sélectionnez New memberState.) Lorsque les données sont mises à jour sur la page Web, comment puis-je conserver les modifications dans la table des membres? colonnes suivantes:. UserId, prenom MiddleInitial, LastName, CreateDate, ModifyDate Je ne suis pas sûr de savoir comment enregistrer les modifications dans la base de données

Merci,

+2

Pourquoi ne pas créer une question de son propre ici sur SO? Vous obtiendrez beaucoup de meilleures réponses de cette façon! Quoi qu'il en soit ... lorsque vous persistez, vous devez récupérer le membre et utiliser les valeurs modifiées de votre instance membertate et mettre à jour. –

Questions connexes