2009-08-24 3 views
1

Ich habe einen Bericht, der versucht, Order.Customer.Address.Line1 in einem Bericht anzuzeigen. Mein Bestellobjekt stammt aus einer Linq2Sql-DBML-Datei.VS2008, Reporting über RDLC gibt Probleme mit Objekten der zweiten Ebene aufgrund von Lazy load

Im Bericht ich es als Fields! Customer.Value.Address.Line1 definieren, aber es kommt als „# Fehler“.

Ich habe dann versucht „rührend“ die Variable, bevor es die RDLC und lo-und-siehe, es plötzlich funktionierte vorbei.

Offenbar geschieht dies nur in der zweiten Ebene, wie ich Fields! Customer.Value.Name problemlos drucken kann.

I könnte dann einfach berühren alle Second-Level-Objekte, aber es scheint .. töricht.

Kennt jemand eine Möglichkeit, es arbeitet zu machen, so dass ich das nicht tun müssen?

Antwort

1

WAG ... sondern entsorgen Sie die Datacontext vor Ihrem Bericht angezeigt werden? Linq to Sql verwendet die verzögerte Ausführung, sodass Ihre "Objekte der zweiten Ebene" nicht vorhanden sind, bis Sie auf sie zugreifen. Linq to Sql-Entitätsklassen speichern Informationen darüber, wie auf einige Dinge zugegriffen werden kann (wie Sammlungen verwandter Datensätze), anstatt alles auf einmal zu laden. Wenn der DataContext, der zum Laden Ihrer Entitäten verwendet wurde, sich vor dem Zugriff auf diese verzögerungsgeladenen Teile verabschiedet, wird dies fehlschlagen. Wenn Sie sie zuerst berühren, werden sie geladen, bevor der DataContext verschwindet.

Eine Sache, die Sie tun können, ist zu faul Laden auf die Teile Ihrer Modelle deaktivieren Sie in diesem Szenario mit antizipieren. Here's a blog post about doing this. Die andere Möglichkeit besteht darin, diese vor dem Zurückgeben zu berühren, indem "ToArray()" oder "ToList()" oder etwas Ähnliches wie diese verzögerten geladenen Sammlungen aufgerufen werden. Was am besten ist, hängt von Ihrem Design ab. Das Abschalten von Lazy Loading ist wahrscheinlich die schnellste und einfachste Lösung.

+0

Danke für den Link. Ich erstelle den Bericht und rende ihn auf einmal in eine PDF-Datei um, also denke ich nicht, dass der DataContext verschwindet. Ich habe auch versucht, "ExecuteInCurrentAppDomain" zu setzen, aber ich bin nicht wirklich sicher, was das erreichen sollte. Es war nur etwas, das ich irgendwo gelesen habe. – Soraz