Im Prinzip ist es so, dass .net (Ado.net SqlConnection zB) einen ConnectionPool besitzt, und diesen verwaltet.
Wenn du eine Verbindung brauchst, bekommst du eine aus diesem Pool, es wird also nicht jedes mal eine komplett Neue erzeugt.
Es wäre aber so und so nicht unbedingt clever, eine einzige Verbindung für mehrere Benutzer über einen langen Zeitraum offen zu halten. Die Connections sollten relativ schnell wieder in den Pool zurückfließen.
Ob der designer in VS2010 Sql CE unterstützt weiss ich nicht, glaub ich aber nicht!
Wie du deine dbml datei erzeugst, hat xrc7581 schon gezeigt.
Mein erster satz sollte darauf hinauslaufen, dass du linq natürlich auf alle IEnumerables verwenden kannst! Linq hat ja prinzipiell nix mit datenbanken zu tun. Sondern ist eine sprache um objekte anzusprechen.
natürlich kannst du mit linq auf die erzeugten datasets zugreifen.
Darum ja meine frage, ob du LinqToSql verwenden möchtest, also die Tabellen mit dem O/R Mapper ansprechen willst, oder nicht! Denn in der dbml befinden sich dann diese "Sql-Classes", welche für jede Tabelle inkl Assoziationen erstellt werden.
Damit hättest du dann deine DB-Daten in Programm als Objekte zur Verfügung.
wenn du Linq verwenden möchtest, weiss ich grad nicht, ob du LinqToSql meinst?!
Wenn ja, musst du für deine .sdf eine dbml Datei erstellen.Das machst du mit sqlmetal.
In der generierten datei ist dann ein DataContext, welcher die Verbindung zu deiner DB regelt.
Zur datenbindung an form-elemente gibt es mehrere möglichkeiten.
MVP wäre ein stichwort. Normales databindung mit Linqentitäten sollte aber auch funktionieren, da diese standardmäßig InotifyPropertyChanged implementieren.
...aber zumindest sollte man wissen worum es geht, um sagen zu können, dass es einem nicht gefällt. Ansonsten kann man halt sagen, dass es einen nicht interessiert, aber es schlecht machen ohne Begründung ist ziemlich vermessen.
und genau da hatte ich doch bei herbivore den eindruck, das er sich mit ebc ebschäftigt hat. Es gab ja zu 1.0 auch eine fundierte? diskussion?
Auch wenn ich die ebcs wahrlich interessant finde, was ja das ausgangsthema war, haben doch trotzdem alle ihre meinungsfreiheit. Und das ist gut, solange ich niemanden beleidige oder sittliche/gesetzliche grenzen übertrete, und das hat er nicht.
Und diese freiheit sollte auch ein experte (denn das ist herbivore zweifelsohne) mit über 50k posts haben.
Ich kann mir nicht ganz vorstellen, sollte es doch so sein wäre es schlimm, dass wenn ein "unbekannter" nutzer herbivors meinung vertreten hätte....es kaum zu einem mittlerweile 3ten subthema ausgeartet wäre.
vielleicht habe ich nur blätter vor den augen, aber folgendes problem:
ich habe ein einfaches CompositeControl geschrieben, welches einige Eigenschaften hat.
Diese Eigenschaften benutze ich in der CreateChildControl-Methode.
Mein problem ist, dass die eigenschaften von einer Page im Page_Load gesetzt werden (Page wird per Redirect aufgerufen, also kein PostBack), allerdings im Control wohl noch nciht zuer verfügung stehen, wenn CreateChildControls aufgerufen wird.
Was mache ich denn hier falsch?
Beispiel
public class MyControl : CompositeControl, INamingContainer
{
int _maximalDataCount;
[Bindable(true)]
[PersistenceMode(PersistenceMode.Attribute)]
[DefaultValue(0)]
[Description("Gibt an, wieviele Daten maximal vorhanden sind")]
public int MaximalDataCount
{
get
{
return _maximalDataCount;
}
set
{
_maximalDataCount = value;
}
}
protected override void CreateChildControls()
{
CreateControlHierarchy();
base.CreateChildControls();
}
protected virtual void CreateControlHierarchy()
{
//hier benötige ich die eigenschaft, ist allerdings noch nciht vorhanden, da in
//den setter erst NACH dem aufruf der CreateChildControls gegangen wird
}
}
Die Eigenschaft habe ich schon auf alle möglichen arbeiten gespeichert, im ViewState und ControlState (sind aber nur für PostBacks verfügbar?)
und hier das setzen der eigenschaft in einer page, wo dieses control im markup vorhanden ist
MyControl1.MaximalDataCount = 100;
ich muss dazu sagen, ich entwickle eigentlich sonst keine Serversteuerelemente, daher fehlt mir hier vielleicht auch eine entsprechende grundlage, aber mein studium der msdn hat mir auch nicht so viel weitergeholfen.
Ich bin auch wieder mal da!
Wollte mit meinem thread keinen streit vom zaun brechen =(
@ralfw: Auch wenn ich mich vielleicht mit dem "engagement", wie hier das für und wider diskutiert wird nicht ganz anfreunden kann, möchte ich trotzdem sagen das die ebcs mich wahnsinnig interessieren...und darum sollte es ja hier gehen.
Ich finde es gut, dass es überhaupt leute gibt, die sich sowas einfallen lassen. Es ist dann natürlich klar, dass man "sein baby" ins trockene bringen möchte.
@Haggy: danke, denn dein beitrag ist eigentlich genau das, worum es mir eingangs ging. Ich kann mir eben ebcs für ccc super vorstellen. Aber mir macht es eben probleme bei domainlogik. Produktiv habe ich sie noch nicht im einsatz, eben weil mir da noch zu viele fragezeichen über dem kopf stehen. Sollten diese allerdings beseitigt werden, würde ich ebcs gern produktiv einsetzen.
Ok, so hab ich es mir ja schon gedacht, war mir nur nicht sicher ob es wirklich die richtige herangehensweise ist. Danke erstmal.
Ich lese die blogs schon fleißig, bin aber noch nicht mit allen artikeln durch.
Die EBC 2.0 sache klingt interessant.
Hast du dafür vielleicht einen link zu einem deiner artikel, der diesen sachverhalt etwas genauer erklärt?
ja ich würde mich freuen wenn du mich hier auf dem laufenden halten würdest.
Und wie sieht die sache in normalen informationssystemen aus?
Wie wäre da eine sinnvolle aufteilung auf ebcs?
mfg
serial
[Edit]
@ralfw:
Es liegt vielleicht an der etwas "anderen natur" der ebcs, dass es mir etwas schwer fällt hier eine verbindung zu erkennen (weil ich wohl noch zu sehr in den alten schienen denke).
Zum beispiel das speichern in datenbanken:
Bei normaler komponentenarchitektur würde mein anwendungskern über ein interface eine komponente ansprechen, welche die übergebenen daten speichert. (über einen adapter die technischen details wegabstrahiert)
Es fühlt sich für mcih noch irgendwie komisch an, diesen simplen sachverhalt auf ebcs zu übertragen.
Schickt meine kernkomponente einen "saverequest" an eine db-komponente?
Tut mir leid wenn ich mich hier noch etwas schwer tue, aber ich möchte dieses konzept möglichst komplett verstehen...
ich beschäftige mich schon seit einiger zeit mit event based components (ebc).
Diese herangehensweise finde ich wirklich großartig, allerdings macht es (bis jetzt) für mich nur ein "klares" bild, wenn es systeme sind wie parser oder ähnliches.
Allerdings ist dieses system bei informationssystemen (eingabe, verarbeitung und speichern bzw holen aus datenbanken) für mich noch etwas unscharf (besonders wenn diese verteilt aufgebaut sind).
Wie würdet ihr die ebcs hier anwenden? Mich interessiert eure meinung.
nein leider reicht das nicht, da es nicht implizit gecastet werden kann, darum brauch ich dieses konstrukt.
Zitat von spike24
und bei einem where T: class bin ich auch leicht irretiert, das ist gerade soviel Einschränkung dass keine Valuetypes genommen werden können, aber dennoch sehr nahe bei object.
Ist das ein gewünschtes Verhalten?
Ja das ist gewollt, da ich keine basisklasse bzw interfaces für die linq-objekte besitze.
oh das hba ich mir garnicht so genau angeschaut, aber wenn du zu oft aktualisierst, wirst du auch eine blockierende gui haben, da jede aktualisierung in den gui-thread invoked wird.
ich glaube nicht das du ganze Controls verschicken kannst/solltest.
Lass dir in dem Service lieber nur die Daten erstellen und zurückgeben.
Der Client kann diese dann anzeigen wo und wie er will.
Jetzt müsste ja jeder Client etwas von einem Listview wissen...
ich gaube ich habe wohl einen großen denkfehler, komme aber einfach nicht auf eine saubere lösung.
Folgendes Problem: Ich habe eine Basisklasse Repository<T>, welche in einem Presenter<T> verwendet wird.
Von diesem Repository habe ich ein spezielles abgeleitet: NewsRepository hat eine spezielle Methode zur Volltextsuche, die nur mit dem Datentyp News verwendet werden kann.
Zur Erzeugung benutze ich eine Factorymethod.
Basisklasse:
public class Repository<T> where T:class
{
//Factorymethod
public static Repository<T> Create()
{
if (typeof(T) == typeof(News))
return (Repository<News>)new NewsRepository() as Repository<T>;
return new Repository<T>();
}
//weitere Methoden
}
NewsRepository
public class NewsRepository:Repository<News>
{
public IEnumerable<News> Search(string searchTerm, IEnumerable<System.Linq.Expressions.Expression<Func<News, bool>>> filters, List<KeyValuePair<string, bool>> sorters, int maxCount, int skip, bool readOnly)
{
//suche
}
}
Und benutzung im Presenter:
public abstract class DataPresenterBase<T> : PresenterBase, IDataPresenterBase where T: class {
protected List<T> _data;
protected Repository<T> _repository = Repository<T>.Create();
So, nun meine Frage, ist die Factorymethod so wirklich eine schöne Lösung?
Für mich sieht das sehr "gehackt" aus, geht das schöner?
Und 2tens, um dieses ewsRepository zu benutzen, komme ich im NewsPresenter:DataPresenterBase<News> nicht um einen cast herum, oder?
ich hoffe ihr könnt mir die erleuchtung bringen...
in diesem Ereigniss erstelle ich einen eigenen AppContext, welcher wichtige Informationen zur Seite enthält (uA acuh eine Id, welche die Seite identifiziert)....diese ID ist für die ErrorPage auch relevant, weil über diese Id eine MasterPage geladen wird, welche auch im Fehlerfall geladen werden sollte, damit die ErrorPage für jeden Kunde (jeder Kunde hat eine Id) im Kundenspezifischen Style darstellt.
Da der AppContext in der Session gehalten werden muss, brauche ich dieses Ereignis, da ich vorher keinen Sessionstate zur Verfügung habe (soweit ich das noch in erinnerung habe)
Der einfachste ist sicher, die ID in die Url zu übergeben (...aspx?ID=1234), deine Detailseite wertet diesen Parameter dann aus.
Oder du benutzt etwas "fortgeschrittenere" techniken, welche im zusammenhang mit mvp aber relativ statndard sind, zB den Worfkflowcontroller (da findest sicher bei der msdn etwas)...hier ist das prinzip, das dein gridview das detailview enthält, und die kommunikation beider über einen controller läuft, welcher dann auch für die weitergabe deiner id zuständig ist.