Ich lese gerade über persistierende Objekte in .net. Daher kann ich keine Best Practice anbieten, aber vielleicht können meine Erkenntnisse Ihnen einen Nutzen bringen. Bis vor ein paar Monaten habe ich immer handcodierte Abfragen verwendet, eine schlechte Angewohnheit aus meiner ASP.classic-Zeit.
Linq2SQL - Sehr leicht und einfach in Betrieb zu nehmen. Ich liebe die stark typisierten Abfragemöglichkeiten und die Tatsache, dass die SQL nicht sofort ausgeführt wird. Stattdessen wird es ausgeführt, wenn die Abfrage fertig ist (alle Filter angewendet), so dass man den Datenzugriff von der Filterung der Daten trennen kann. Außerdem kann ich mit Linq2SQL Domänenobjekte verwenden, die von den Datenobjekten, die dynamisch generiert werden, getrennt sind. Ich habe Linq2SQL noch nicht in einem größeren Projekt ausprobiert, aber bisher scheint es vielversprechend zu sein. Oh, es unterstützt nur MS SQL, was eine Schande ist.
Entity Framework - Ich habe ein wenig damit herumgespielt und es hat mir nicht gefallen. Es scheint alles für mich tun zu wollen und funktioniert nicht gut mit gespeicherten Prozeduren. EF unterstützt Linq2Entities, was wiederum stark typisierte Abfragen ermöglicht. Ich glaube, es ist auf MS SQL beschränkt, aber ich könnte mich irren.
SubSonic 3.0 (Alpha) - Dies ist eine neuere Version von SubSonic, die Linq unterstützt. Das Tolle an SubSonic ist, dass es auf Vorlagedateien (T4-Vorlagen, geschrieben in C#) basiert, die Sie leicht ändern können. Wenn Sie also möchten, dass der automatisch generierte Code anders aussieht, ändern Sie ihn einfach :). Ich habe bisher nur eine Vorschau ausprobiert, werde mir aber heute die Alpha-Version ansehen. Schauen Sie mal hier SubSonic 3 Alpha . Unterstützt MS SQL, wird aber bald auch Oracle, MySql usw. unterstützen.
Bislang bin ich zu dem Schluss gekommen, Linq2SQL zu verwenden, bis SubSonic fertig ist, und dann darauf umzusteigen, da SubSonics Vorlagen viel mehr Anpassungen ermöglichen.