2012-02-24 5 views
0

J'utilise LINQ comme ORM dans un projet d'application Web utilisant VS2010. J'ai défini l'ER dans la base de données SQL et simplement glissé et déposé les tables de base de données dans l'ORM. La table Transfer a 4 relations avec la table Hospital avec 4 colonnes différentes. Une des colonnes est FK, int, pas null. Les trois autres sont FK, int, null. Dans le DBML, la classe Transfer a 4 associations à la classe Hospital. L'association avec Transfer.Hospital (FK, int, not null) requis a les propriétés suivantes.Associations dans ASP.Net MVC2

Cardinality: OneToMany 
Child Property: True 
    Access: Public 
    Inheritance Modifier: (None) 
    Name = Transfers1 
Parent Property 
    Access: Public 
    Inheritance Modifier: (None) 
    Name: HospitalSrcOrDest 
Participating Properties: Hospital.HospitalID -> Transfer.Hospital 
Unique: False 

Le modèle de vue utilisé par la page de vue possède une propriété de transfert du type de transfert. Le Model.Transfer.Hospital a toujours une valeur entière. Cependant, le script Model.Transfer.HospitalSrcOrDest dans la page suivante est toujours null. HospitalName ne devrait-il pas être automatiquement récupéré via l'association Hospital_Transfer1? Merci.

<%: Model.Transfer.HospitalSrcOrDest != null ? Model.Transfer.HospitalSrcOrDest.HospitalName : string.Empty%> 

Répondre

0

Je modifié mon constructeur référentiel, mais il ne fait aucune différence.

public AppRepository() //constructor 
{ 
     // Create DataLoadOptions 
     DataLoadOptions dlo = new DataLoadOptions(); 

     // Always fetch source or destiation hospital when we get transfer 
     dlo.LoadWith<Transfer>(t => t.HospitalSrcOrDest); 

     // Set these options on the DataContext 
     db.LoadOptions = dlo; 
.... 

} 

Si je comprends bien, LINQ utilise Désireuse Chargement par défaut (http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/06/linq-to-sql-deferred-loading-lazy-load.aspx). Dans mon modèle de vue, le transfert est transmis par le contrôleur. Dois-je ajouter une propriété HospitalSrcOrDest au modèle View et charger la valeur en naviguant dans l'association.

public ActionResult Edit(string id) 
{ 
.... 

Transfer transfer = base.ApplicationRepository.GetTransfer(intID); 

if (transfer == null) 
    { 
    ViewData["Message"] = "There is no transfer record"; 
    return View("NotFound"); 
    } 

TransferViewModel vm = new TransferViewModel(base.ApplicationRepository, transfer, "Edit"); 

return View(vm); 
} 
0

Il pourrait être un problème de charge paresseux, vous displosing DataContext avant l'hôpital est accessible par la vue? Par défaut, L2S charge les relations paresseuses. Ce qui signifie qu'il ne l'obtient pas de la base de données tant que la propriété n'est pas réellement accessible. Si votre connexion a disparu au moment où la vue accède à l'hôpital, elle peut ne pas être en mesure de la récupérer. Juste une supposition.

Pour le tester, dans votre contrôleur, après avoir effectué votre chargement/sélection, essayez immédiatement d'accéder à l'hôpital pour le forcer à charger.

Si vous voulez toujours aggressif l'hôpital, voici un lien qui vous montre ce qu'il faut faire: http://blog.dantup.com/2009/04/eager-fetching-of-relationships-with.html

+0

J'ai défini l'option loadoption dans le constructeur du référentiel comme suggéré, mais cela ne fait aucune différence. // Création de DataLoadOptions DataLoadOptions dlo = new DataLoadOptions(); // Toujours chercher les étiquettes lorsque nous recevons des messages dlo.LoadWith (p => p.Tags); // Définir ces options sur le DataContext db.LoadOptions = dlo; – user266909