"The remote server returned an error: NotFound."
Es tracta d'un error genèric, no és que haguem escrit malament el nom del servei al que ens volem connectar ni res d'això.
Per trobar l'error real cal posar configurar el tracing, això es fa tocant el 'web.config'.
Al meu cas m'he trobat amb aquest error:
"The InnerException message was 'Maximum number of items that can be serialized or deserialized in an object graph is '65536'."
El cas és que passava sense contemplacions del servidor al client tota la taula de la base de dades, que sembla ser grossa. Per passar-la cal serialitzar-la abans i això provocava l'error.
Com que el que jo estic carregant en realitat és un arbre el que he fet ha estat tocar el domain service i crear dos serveis nous - Jo això ho volia evitar perquè a cada moment estic posant noves taules dins l'EF i per tant haig de regenerar els fitxers (cosa que fins ara feia borrant-los i creant-los de nou i ara ja no serà tant directe). El primer dels dos serveis que he creat és per carregar els nodes arrel:
Public Function GetVEconomia_unitatsDArrel() As IQueryable(Of VEconomia_unitatsD)
Dim r = From x In ObjectContext.VEconomia_unitatsD.Include("unitatChildren")
Where (x.IdPare = 0)
Select x
Return r
End Function
I el segon per carregar els fills d'un node:
Public Function GetVEconomia_unitatsDChild(ByVal id As Integer) As IQueryable(Of VEconomia_unitatsD)
Dim r = From x In ObjectContext.VEconomia_unitatsD.Include("unitatChildren")
Where (x.IdPare = id)
Select x
Return r
End Function
És important recordar que si volem passar els objectes de negoci associats a un objecte de negoci hem de decorar el metadata amb l'anotació include:
<Include()>
Public Property unitatChildren As EntityCollection(Of VEconomia_unitatsD)
Després d'això l'únic que he hagut de fer és carregar les dades de manera recursiva. Primer he carregat els nodes arrel i a partir d'allà la resta de l'arbre:
Partial Public Class vwParUnitats2CentresDeCost
Inherits Page
Dim CActx As New CADomainContext()
Dim unitatsTree As New List(Of VEconomia_unitatsD)
Dim loadOperationUnitats As LoadOperation(Of VEconomia_unitatsD)
Public Sub New()
InitializeComponent()
Dim q3 = CActx.GetVEconomia_unitatsDArrelQuery()
loadOperationUnitats = CActx.Load(Of VEconomia_unitatsD)(q3)
AddHandler loadOperationUnitats.Completed, AddressOf loadOperationUnitats_Completed
End Sub
Private Sub loadOperationUnitats_Completed(ByVal sender As Object, ByVal e As EventArgs)
Dim llista = directcast(sender, loadoperation(of VEconomia_unitatsD) ).Entities.ToList
If llista.Any AndAlso llista.First.IdPare = 0 Then
unitatsTree = llista
TreeViewUnitats.DataContext = unitatsTree
End If
For Each item In llista
For Each fill In item.unitatChildren
Dim q2 = CActx.GetVEconomia_unitatsDChildQuery(fill.IdUnitat)
loadOperationUnitats = CActx.Load(Of VEconomia_unitatsD)(q2)
AddHandler loadOperationUnitats.Completed, AddressOf loadOperationUnitats_Completed
Next
Next
End Sub
I aquest és el nostre bricoconsejo per avui. No us deixeu la rebobinada.
Una darrera reflexió: algú podria pensar que fora més interessant anar carregant els nodes amb lazy load a mesura que els expandim. Segurament té raó, però no per aquest cas, perquè necessito tot l'arbre carregat perquè la lògica de negoci em fa que hagi de mostrar la situació de diferents nodes de l'arbre a mesura que em pregunten per diferents objectes de negoci. Ah! Per fer el IsSelected hauré de fer servir la funció ContainerFromItem.
També pots augmentar la mida del maxItemsInObjectGraph:
http://social.msdn.microsoft.com/Forums/en-NZ/wcf/thread/f408be56-6983-4c1c-8275-aae9c73ab2d6
Cap comentari:
Publica un comentari a l'entrada