2009-11-25 5 views
0

Voici la scène ..... I 2 contextes distincts dans LINQ, la base de données actuelle est une, et les contextes soulèvent des inquiétudes de base, et dans ce cas, j'utilise 3 tables.LINQ to SQL Plusieurs fichiers DBML

Tableau 1 (AccountId) (Contexte 1)

Tableau 2 (personID) (Contexte 2)

Tableau 3 (AccountId, personID) (Contexte 2)

Alors qu'est-ce qui se passe ici est Cela (Context 2) ne peut créer un enregistrement sur le tableau 3 qu'après un enregistrement a été créé dans le tableau 1.

Dans cet esprit, j'ai créé un ActionScheduler, qui prend tous les 3 objets Linq to SQL, et crée des observateurs sur les propriétés importantes (AccountId, PersonId) et lorsque les deux ne sont pas les valeurs par défaut (0), signifiant qu'ils ont été insérés, l'objet 3rd (Table 3) est ensuite assi- gné à AccountId et ajouté à la liste Table 2s des objets Table 3.

Donc, ce que j'aurais à faire techniquement, c'est d'appeler deux fois SubmitChanges et les choses seraient bien.

Eh bien c'est exactement quand les choses se décomposent. Je fais le premier appel, le tableau 1, est inséré en déclenchant l'événement sur l'ActionScheduler, puis met à jour l'objet Table 3, puis Table 2 obtient l'objet Table déclencheur inséré, qui maintenant répondent à l'exigence (Les deux PersonId, AccountId sont valides), Table 3 objet est ajouté à l'objet Table 2. La seconde sauvegarde est appelée, et il n'y a pas de modifications ici, donc rien n'est ajouté, maintenant si les mêmes contextes sont ouverts, j'ajoute un autre ensemble d'objets, et je sauvegarde tout, le nouvel objet Table 3 ne reçoit pas ajouté (même comportement), mais l'autre fait avec des valeurs parfaites, donc il semble que ce gars est toujours un pas en arrière.

Des sugestions? Existe-t-il une meilleure façon de procéder, à quel point le cycle de vie SubmitChanges est-il exaclté?

Désolé pour toutes les questions, mais cela me dérange vraiment. Et un merci évident.

Répondre

0

Vous ne devriez pas casser une seule base de données dans des contextes séparés. Si vous consolidez vers le bas dans un contexte unique que vous pouvez faire:

YourDataContext db = new YourDataContext(); 

Table1 account = new Table1(); 
db.Table1s.InsertOnSubmit(account); 

Table2 person = new Table2(); 
db.Table2s.InsertOnSubmit(person); 

Table3 link = new Table3(); 
link.Account = account; 
link.Person = person; 
db.Table3s.InsertOnSubmit(link); 

db.SubmitChanges(); 

qui soumettra tous les trois dans un seul appel et (en supposant que les propriétés d'identité sont des colonnes d'identité) mettre à jour les ID de vos objets.

+0

Il ne sera pas comme je l'ai décrit, la Table1 quitte dans un autre contexte, ce qui signifie que je ne peux pas garantir l'ordre d'exécution, donc l'accountId dans le compte, sera 0, et échouera. – Oakcool

+0

Bon, et je dis que vous ne devriez pas faire pour séparer DBML pour une seule base de données. Si vous faites tout à partir du même DataContext (comme prévu), l'ordre d'exécution est géré pour vous. – Nate