2010-01-06 6 views
1

Je reçois System.NotSupportedException: An attempt has been made to Attach or Add an entity that is not new perhaps having been loaded from another DataContext lorsque je souhaite mettre à jour un objet avec des entités enfants.Mise à jour de l'objet LINQ to SQL provoquant System.NotSupportedException

Le scénario est comme ceci:

J'ai un SubscriberProvider qui me permet de créer des abonnés.

var provider = new SubscriberProvider(); // Creates a new repository with own datacontext 

var newSubscriber = new Subscriber 
{ 
    EmailAddress = emailAddress, 
}; 

newSubscriber.Interests.Add(new Interest{ 
           Id=1, 
           Name="cars" 
          }); 

provider.Subscribe(newSubscriber); 

Sur une page d'inscription normale, cela fonctionne très bien.

Maintenant, j'ai une classe membre de linq2sql (récupérable par un MemberRepository) et je veux l'étendre à une aide méthode abonne comme ceci:

var repository = new MembershipRepository(); // Holds its own datacontext 
var member = repository.Get("member1"); 

member.Subscribe(); // transfer member's info and interests to subscriber's table 

L'exception se produit lorsque SubscriberProvider tente d'ajouter les intérêts de la membre. Commentant

newSubscriber.Interests.Add(new Interest{ 
           Id=1, 
           Name="cars" 
          }); 

fera le travail member.Subscribe().

member.Subscribe() est simplement:

public void Subscribe(bool emailIsVerified, bool receiveEmails, bool sendDoubleOptIn) 
    { 
     var provider = new MailingListProvider(); 

     provider.Subscribe(EmailAddress, emailIsVerified, receiveEmails, CountryId, sendDoubleOptIn, ConvertInterests(MemberInterests.ToList())); 
    } 

Alors ce qui cause les entités enfants (intérêts) de perdre leur datacontext quand je fais member.Subscribe() et comment puis-je faire au sujet de la fixation de ce?

+0

Afficher le code de 'member.Subscribe' –

+0

ajouté comme demandé – zulkamal

Répondre

0

J'ai trouvé la solution moi-même. Il s'avère que c'était la méthode ConvertInterests() qui le provoquait. L'objet d'intérêt converti avait une déclaration invalide qui compilait ok.

En pensant que le code était assez simple, je n'ai pas créé de test pour cela. J'aurais du être mieux informé!

0

Il semble qu'il y ait du code manquant ici, mais je vais quand même prendre un coup parce que je pense avoir une idée de ce qui se passe.

Si vous avez créé un DataContext différent pour votre MembershipRepository et votre SubscriberRepository, vous allez rencontrer des problèmes liés aux entités "ayant été chargées à partir d'un autre DataContext". (comme l'indique l'exception que vous avez affichée). Vous ne pouvez pas simplement retirer un objet d'un DataContext et l'enregistrer dans un autre.

Il semble que vous ayez un problème d'architecture ici. Ces deux référentiels devraient-ils être séparés? Si oui, devraient-ils avoir des DataContexts complètement différents? Je recommanderais probablement d'utiliser Dependency Injection pour injecter vos DataContexts dans vos référentiels. Ensuite, vous pouvez décider comment mettre en cache vos DataContexts.

+0

J'ai rendu l'exemple de code simple. J'utilise actuellement l'injection de dépendance sur les deux référentiels. Subscribe() fonctionne correctement si je mets les intérêts à zéro. Ce que je ne comprends pas, c'est pourquoi le datacontext ne se recurdera pas avec les entités enfants de l'Abonné. Merci pour le conseil de mise en cache. Je vais regarder dans ceci. – zulkamal

0

Cette ligne de code que vous avez commentée est signalée par le DataContext comme un nouvel enregistrement, même s'il est probable que l'enregistrement existe déjà en raison du message d'erreur.

Modifiez la ligne:

newSubscriber.Interests.Add(DataContext.Interests.Where(a => a.Id == 1).Single()); 

Maintenant, le DataContext saura que le dossier est celui qui existe déjà, et ne sera pas essayer de l'ajouter comme une insertion à l'ChangeSet.

Questions connexes