2010-06-24 4 views
1

Voici mon association d'objet:LINQ to SQL Problème insertion d'objets multiples qui sont les mêmes

Summary 
-> Job 
    -> Operator 
-> Job 
    -> Operator 

Alors, j'ai un objet sommaire qui contient une collection d'emplois, qui a un objet opérateur (horloge #, nom, etc.)

Lors de la création d'un nouveau résumé, je passe en revue et crée les nouveaux travaux qui existent et j'ajoute toutes les propriétés. Ensuite, effectuez une seule insertion sur l'objet Résumé qui est construit. Ensuite, cela insère de nouveaux travaux et opérateurs si nécessaire, sinon je peux lire des Jobs et Operators existants à partir de la base de données.

Le problème survient lorsque j'ai le même opérateur qui exécute les deux tâches et que l'opérateur n'existe pas dans la base de données. Linq-To-SQL essaie d'insérer le même objet deux fois et échoue depuis que j'utilise l'horloge # comme clé primaire.

Je peux créer un numéro automatique pour la clé primaire, mais alors je vais avoir des données en double et je préfère ne pas le faire. Est-ce que quelqu'un a des idées pour contourner cela?

Merci!

+0

Nouveau problème ... lorsque j'essaie d'insérer l'opérateur lors de la création des objets enfants du résumé (via une boucle), Linq essaie de soumettre tous les changements (y compris le résumé partiellement construit). Certains champs de date ne sont pas remplis, ce qui provoque le blocage de l'insertion. De plus, j'utilise StructureMap pour mettre en cache la base de données afin que les différents dépôts utilisent la même instance. – Dragn1821

Répondre

1

Je pense que le problème réside dans la façon dont vous écrivez votre création d'objet. Je ne l'ai pas vu votre code, mais je pense que vous faites quelque chose comme ceci:

Summary summary = new Summary 
            { 
             Jobs = new List<Job> 
               { 
                new Job 
                 { 
                  Operator = new Operator {Name = "foo"} 
                 }, 
                new Job 
                 { 
                  Operator = new Operator {Name = "foo"} 
                 } 
               } 
            }; 

Si tel est votre cas, essayez instanciation l'opérateur « foo » au préalable, puis l'assigner aux deux emplois.

Si vous le faites déjà et recevez toujours l'erreur, vous devez créer l'opérateur avant de l'enregistrer dans la base de données, puis l'extraire et l'affecter aux tâches souhaitées.

+0

Oui, c'est similaire à ça. La seule différence est où vous créez le nouvel opérateur, je ferais une vérification avec le db d'abord et tirer de là si elle existe. J'avais pensé à votre solution, mais je crains qu'elle ne prenne beaucoup de temps pour réécrire ce que nous avons déjà construit. J'espérais qu'il y aurait une simple propriété que je pourrais activer et Linq vérifierait ce genre de chose ... – Dragn1821

+0

Fini par devoir faire une vérification lors de l'ajout du nouvel opérateur pour voir s'il y a plus d'un emploi ... si donc, et l'opérateur sont les mêmes, puis définissez l'objet opérateur dans le 2ème travail à la valeur de l'objet opérateur dans le premier travail (au lieu de créer un nouvel opérateur pour le deuxième travail). Semble fonctionner. – Dragn1821