2010-06-29 5 views
0

J'ai un problème avec l'héritage TPT + la clé étrangère. Je travaille sur une application Web avec prise en charge multilingue, y compris la traduction de contenu dynamique. Voilà mes tableaux:Problème de clé TPT et de clé étrangère

Language 
============= 
Id, Name 


ProcessingAgent 
==================== 
Id, some other fields 

LocalizedProcessingAgent 
========================================================= 
LocalizedProcessingAgentId, Name, Description, LanguageId 

Comme vous l'aurez deviné déjà, je me suis déplacé les colonnes qui doivent être traduites ProcessingAgent-LocalizedProcessingAgent. Du côté EF, j'ai fait un héritage TPT, donc ProcessingAgent est une classe de base de LocalizedProcessingAgent. Je suis nouveau à EF, c'est mon premier projet sur lequel j'ai évolué et l'un de ses comportements étranges me trouble vraiment. Lorsque je génère des classes EF à partir de la base de données, LocalizedProcessingAgent possède un langage de propriétés de navigation (en raison de LanguageId). Le problème est que Language propriété est null après que j'Interrogation de la db:

LocalizedProcessingAgentRecord l = db.ProcessingAgents 
    .OfType<LocalizedProcessingAgentRecord>().First(p => p.Id == 1); 
//l.Language is null 

La clé étrangère est la navigation pas rempli pour une raison quelconque, je ne sais pas pourquoi. Cela se produit uniquement lorsque je interroge des entités dérivées, dans ce cas LocalizedProcessingAgentRecord. Des idées?

ici est EF balisage XML: http://dl.dropbox.com/u/3055964/ef.xml

Répondre

1

Vous devez explicitement charger cette propriété de navigation.

db.ProcessingAgents.Include("Language").OfType().First(p => p.Id == 1) 

Include se traduira par le chargement désireux de la propriété de navigation.

+0

damn, devrais-je faire la même chose pour chaque requête? Y a-t-il un meilleur moyen d'accomplir cela? :( – Davita

+0

Si vous utilisez v4.0 ef vous pouvez activer paresseux chargement ctx.ContextOptions.LazyLoadingEnable = true En v1.0 ef il n'y a pas de chargement paresseux transparent, mais vous pouvez faire explicitement le chargement paresseux comme ceci:. si (! agent.Language.IsLoaded) agent.Language.Load(); –

+0

Merci yury, votre réponse a été vraiment utile – Davita