2009-10-29 2 views
1

Je ne trouve pas beaucoup d'informations sur la méthode partielle LINQ to SQL OnLoaded() utilisée avec les types d'entité. Je suis confronté à un problème et cela doit être dû à mon manque de compréhension de la façon dont la méthode est censée être utilisée ou à un autre oubli de ma part.L'utilisation de la méthode LINQ to SQL OnLoaded() aboutit à une séquence vide pour ma racine agrégée?

J'ai une racine agrégée, Account, qui a une collection d'entités, de type Balance, appelée BalanceHistory. J'ai défini une propriété dans la classe appelée CurrentBalance qui n'est mappée à aucune colonne de ma table source. Au lieu de cela, j'utilise OnLoaded pour définir sa valeur comme l'entrée la plus récente de la collection BalanceHistory.

partial void OnLoaded() 
{ 
    var balance = this.BalanceHistory 
         .OrderByDescending(b => b.Datestamp) 
         .First(); 
    this.CurrentBalance = balance.Value; 
} 

La collection BalanceHistory est chargée avec l'entité Account, c'est-à-dire qu'elle n'est pas paresseuse. Voici les options de chargement pour ma classe DataContext.

public AccountRepository() 
{ 
    var connection = ConfigurationManager.ConnectionStrings["DbConnectionString"].ConnectionString; 
    this._dataContext = new DbDataContext(connection); 
    var options = new DataLoadOptions(); 
    options.LoadWith<Account>(a => a.BalanceHistory); 
    this._dataContext.LoadOptions = options; 
} 

Le problème que je suis en cours d'exécution en est que chaque fois que je tente de récupérer des objets du compte dans ma classe DataContext, je reçois un InvalidOperationException disant « séquence ne contient aucun élément. » Cependant, si j'utilise le débogueur et examine l'objet DataContext, je peux voir que seuls les objets Account sont manquants. Tous les objets Balance de la collection BalanceHistory sont présents. Toutefois, si je commente la méthode OnLoaded, l'ensemble de comptes est récupéré sans erreur (mais bien sûr, la propriété CurrentBalance n'est pas remplie).

Je dois donc faire quelque chose de mal. Est-ce que quelqu'un a des suggestions? En plus de déterminer ce que je fais de mal, je serais également intéressé à entendre des idées pour une meilleure mise en œuvre.

Merci!

Répondre

2

Probablement CurrentBalance est une propriété ajoutée dans une implémentation de classe partielle. Dans ce cas, je le calculerais la première fois que la propriété est invoquée plutôt que de la remplir lorsque l'objet parent est chargé.

private decimal? currentBalance; 
public decimal CurrentBalance 
{ 
    get 
    { 
     if (!this.currentBalance.HasValue) 
     { 
       var balance = this.BalanceHistory 
           .OrderByDescending(b => b.Datestamp) 
           .FirstOrDefault(); 
       this.currentBalance = balance == null ? 0M : balance.Value; 
     } 
     return this.currentBalance.Value; 
    } 
} 
+0

Merci pour la suggestion - j'aime mieux votre approche. –

Questions connexes