0

-je utiliser LINQ 2 SQL dans l'un de mes projets et j'ai de nombreuses relations client -> documents1, documents2, documents3, Adresse, factures etc ....Pourquoi LINQ 2 SQL lorsque je rejette le contexte tente d'obtenir des relations enfants?

Lorsque vous utilisez la LoadWith (p => p.Documents1) ... etc J'ai des problèmes de performance, imaginez les clients 2000 avec toutes ces nombreuses relations chargées dans la liste en mémoire! L'autre sens Document -> Client n'est pas tellement un problème que la relation sa lumière.

Donc, je tente de supprimer tous les LoadWith et laisser simplement la relation client -> adresse. Maintenant, si je vais ouvrir un Document1 et ensuite ouvrir mes clients, je reçois une exception de disposition d'objet lorsque je sérialise mes clients. La méthode sérialiser renvoie essentiellement cette exception.

La méthode serialize:

public static T CloneObjectGraph<T>(this T obj) where T : class 
     { 
      var serializer = new DataContractSerializer(typeof(T), null, int.MaxValue, false, true, null); 
      using (var ms = new System.IO.MemoryStream()) 
      { 
       serializer.WriteObject(ms, obj); 
       ms.Position = 0; 
       return (T)serializer.ReadObject(ms); 
      } 
     } 

La méthode que je reçois les clients:

public List<Customer> GetCustomers() 
{ 
    using (MyDataContext db = new MyDataContext(MyDataContextManager.ConnectionString)) 
    { 
     DataLoadOptions dlo = new DataLoadOptions(); 
     dlo.LoadWith<Customer>(p => p.Address); 
     dlo.LoadWith<Customer>(p => p.Documents1); 
     dlo.LoadWith<Customer>(p => p.Documents2); 
     dlo.LoadWith<Customer>(p => p.Documents3); 
     dlo.LoadWith<Customer>(p => p.Documents4); 
     dlo.LoadWith<Customer>(p => p.Documents5); 
     dlo.LoadWith<Customer>(p => p.Documents6); 
     dlo.LoadWith<Customer>(p => p.Documents7); 
     dlo.LoadWith<Customer>(p => p.Documents8); 
     dlo.LoadWith<Customer>(p => p.Documents9); 
     dlo.LoadWith<Customer>(p => p.Documents10); 
     dlo.LoadWith<Customer>(p => p.Documents11); 

     db.LoadOptions = dlo; 

     return db.Customers.ToList(); 
    } 
} 

Je veux supprimer toutes les LoadWith sauf relation d'adresses. Je déteste quand cette erreur ne se reproduit pas toujours mais dans certains cas je ne pouvais pas trouver.

Je pourrais deviner le constructeur de DataContractSerializer pour un changement mais je ne peux pas le faire correctement.

Toute aide appréciée!

Répondre

1

Votre erreur se produit car votre méthode clone tente d'accéder à toutes les propriétés enfants de votre objet. Lorsque vous avez les instructions LoadWith <>(), ces propriétés enfant sont déjà extraites de la base de données et disponibles en mémoire. Lorsque vous supprimez les instructions LoadWith <>(), les propriétés tentent de charger les objets à partir de la base de données. Comme vous avez déjà fermé la connexion à la base de données, ces propriétés ne peuvent pas être chargées (et vous obtenez l'erreur).

La solution dépend de ce que vous essayez d'accomplir en effectuant une copie en profondeur des objets; Si cette copie profonde doit réellement avoir les propriétés enfants (DocumentsXX), alors vous devez soit laisser les instructions LoadWith <>() ou vous avez besoin de la connexion à la base de données pour rester ouverte pendant le processus (des deux, laissant le LoadWith < >() instructions est probablement la meilleure option car elle minimise les accès à la base de données et finit par utiliser la même quantité de mémoire de toute façon). Si la copie profonde n'a pas vraiment besoin d'inclure ces propriétés, vous devez remplacer le processus de clonage en cours par qui peut ignorer ces propriétés (un clonage profond créé manuellement ou un processus de sérialisation personnalisé fonctionnerait).

+0

Pouvez-vous donner un exemple comment ignorer ces propriétés? Je n'ai pas besoin des instructions LoadWith <>(). Je vous remercie –