2010-10-09 3 views
1

Je travaille sur un projet Web. J'utilise une base de données Sql Server 20008 R2 via LINQ To SQL, et aujourd'hui je faisais face à un problème très étrange avec les relations. Je les utilise depuis un moment et je n'ai jamais eu de problèmes jusqu'à présent.Un problème très intéressant avec les relations SQL Server (SQL Server 2008R2, LINQ à SQL, Visual Studio 2010, C#)

Disons que j'ai une table Stores qui a les champs suivants: ID, Name, LastUserIDLastUserID est une "référence" à la table Users.

Le tableau des utilisateurs a les champs suivants: ID, Name, FavoriteStoreIDFavoriteStoreID est une "référence" à la table Magasins.

J'ai donc une relation récursive.

Store.LastUser.Name // shows the name of the last user of the store 

User.FavoriteStore.Name // shows the name of user's favorite store. 

Dans le concepteur de Visual Studio cela ressemble à ceci:

---------- 
-  - 
- Users - 
-  - 
---------- 


| /\ 
| | 
| | 
\/ | 


---------- 
-  - 
- Stores - 
-  - 
---------- 

Maintenant, le problème est, quand il y a deux flèches (deux relations), un seul d'entre eux travaille. Lorsque j'utilise l'autre, j'obtiens l'erreur Object reference not set to an instance of an object..

Lorsque je recrée la table, ajoutez d'abord cette relation (celle qui a déclenché une exception), cela fonctionne. Mais quand j'en ajoute un autre, ça ne marche pas. Donc, évidemment, j'ai foiré quelque chose, et SQL Server ne comprend pas comment interpréter ce que je veux qu'il fasse.

Comment puis-je résoudre ce problème?

Répondre

0

Je ne sais pas quel était le problème, mais j'ai recréé la table, et maintenant ça marche bien. Donc, LINQ To SQL DOES fonctionne avec des références circulaires.

0

Il semble que vous définissiez deux associations d'entités lorsque vous n'en avez besoin que d'une, ce qui peut créer une confusion entre LINQ et SQL. Dans votre concepteur dbml, essayez de configurer une seule association entre vos tables Users et Stores, et dans les propriétés de l'association, définissez la cardinalité sur OneToOne et créez une propriété enfant et une propriété parent sur vos entités User et Store. Même avec une seule association entre les deux tables, vous devriez toujours être en mesure d'obtenir le magasin de l'objet utilisateur et l'utilisateur de l'objet magasin.

1

Le problème est que le concepteur ne peut pas comprendre la référence circulaire. Je gérerais cela en créant la référence manquante dans le concepteur.

Questions connexes