2009-06-08 6 views
1

I construit un modèle Entity Framework (v1) qui comprend l'héritage, comme celui-ci:LINQ to Entities

Classe de base: Problème

< - plainte

< - CustomerQuery etc. (6 classes dérivées)

Ces classes correspondent aux tables correspondantes dans SQL Server. J'ai été impressionné par la façon dont je pourrais utiliser LINQ pour créer des entités - EF estime qu'il doit mettre des données dans une table, obtenir la valeur de la clé d'identité et l'utiliser dans l'autre table.

MAIS: Quand je fais une requête simple comme la

suivante
var result = dataContext.IssueSet.Where(x => x.Id == id); 

... le ToTraceString révèle code SQL plus de 1000 lignes longues! Et cela fonctionne avec peine.

Pensez-vous qu'il est probable que j'ai fait quelque chose de mal dans mon modèle ou est l'énorme code SQL caractéristique des structures d'héritage dans L2E?

P.S. Voici le début de de la chaîne de trace SQL pour info:

SELECT 
1 AS [C1], 
CASE WHEN ((NOT (([UnionAll8].[C45] = 1) AND ([UnionAll8].[C45] IS NOT NULL))) 
AND (NOT (([UnionAll8].[C46] = 1) AND ([UnionAll8].[C46] IS NOT NULL))) 
AND (NOT (([UnionAll8].[C47] = 1) AND ([UnionAll8].[C47] IS NOT NULL))) 
AND (NOT (([UnionAll8].[C48] = 1) AND ([UnionAll8].[C48] IS NOT NULL))) 
AND (NOT (([UnionAll8].[C49] = 1) AND ([UnionAll8].[C49] IS NOT NULL))) 
AND (NOT (([UnionAll8].[C50] = 1) AND ([UnionAll8].[C50] IS NOT NULL))) 
AND (NOT (([UnionAll8].[C51] = 1) AND ([UnionAll8].[C51] IS NOT NULL))) 
AND (NOT 
+0

Je pense que vous avez probablement fait quelque chose de bizarre dans votre configuration de EF - J'ai utilisé EF pendant un certain temps et je n'ai jamais eu de tels problèmes. –

+0

Je ne suis pas encouragé après avoir lu ceci: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/e412859c-4c85-4769-8c14-96bd0f3e022b (quelques personnes qui se retrouvent avec 10k lignes de SQL et aucune solution en vue) – Martin

Répondre

1

Je ne pense pas que cette requête est simple du tout. Considérez ce que vous demandez réellement au framework: matérialiser une entité qui pourrait être l'une d'au moins six types différents. En fait, vous savez probablement quel type d'entité vous tentez de matérialiser; vous n'avez simplement pas donné cette information à la structure.

Ainsi, quelques réflexions:

  • Lors de la sélection des entités d'un seul type d'un jeu d'entités qui comprend plusieurs types, utilisation OfType pour informer le cadre que vous ne comptez pas se matérialiser d'autres types .
  • Envisagez d'utiliser une table par hiérarchie plutôt que des modèles table par type, en particulier lorsque la plupart des sous-types ont plusieurs champs en commun.
  • Dans les limites d'une bonne OOD, n'utilisez pas trop l'héritage. Je trouve que beaucoup de gens ont tendance à utiliser l'héritage pour des problèmes qui seraient mieux résolus par la composition, avec ou sans Entity Framework.
  • Faites attention à ne pas écrire Entity Framework simplement parce que vous avez eu un problème lors de votre première tentative d'utilisation en lisant quelque chose sur un tableau de messages qui vous a mis en pause. Le cadre est complexe, il fonctionne différemment de ce que beaucoup de gens attendent, mais il fonctionne bien quand vous le comprenez. Votre première tentative d'utilisation ne sera probablement pas correcte. Restez avec et apprenez comment le cadre fonctionne.
+0

L'utilisation de OfType génère une requête similaire (plus de 1000 lignes). TPH est sérieusement désagréable - viole les pratiques de données que j'ai appris à apprécier. Nous utilisons des bases de données relationnelles/normalisation pour une raison - un ORM ne devrait pas nous forcer à partir de bonnes pratiques. Même un cas d'héritage simple semble aboutir au même modèle de génération SQL, donc je ne vois pas comment il peut actuellement être utilisable dans un scénario réel. J'essaie vraiment de rester avec L2E mais j'ai été obligé de me rabattre sur les procs stockés (avec des extensions EF) dans le cas de requêtes d'héritage, ce que j'espérais vraiment éviter. – Martin

+0

Faites attention à vous dire que "Entity Framework fonctionne comme ça". C'est une excuse pour éviter de résoudre le problème. Nous utilisons l'héritage dans nos modèles d'entité (bien que, à partir des sons de celui-ci, je doive moins que vous, je le trouve moins nécessaire pour les objets de valeur que pour les types avec des comportements) voir plus de 1000 lignes de SQL dans les requêtes. Donc, quelque chose ne va pas dans votre scénario. Je suggère de commencer avec un modèle plus simple et de le construire selon le modèle que vous voulez un morceau à la fois pour voir où le problème entre en jeu. –

Questions connexes