Laden...
F
fluxy myCSharp.de - Member
Fachinformatiker Anwendungsentwicklung Herdecke Dabei seit 27.03.2009 183 Beiträge
Benutzerbeschreibung

Forenbeiträge von fluxy Ingesamt 183 Beiträge

19.05.2011 - 13:52 Uhr

Wie Winsharp schon geschrieben hat

mit is kannst du auf einen Typen prüfen. also item is Button liefert true, wenn das Item ein Button oder ein von Button abgeleitetes objekt ist. Mit einem weichem Cast (as) kannst du in deinen Typen casten. Wenn der Cast misslingt, bekommst du null zurück.

Ich würde aber ersteres bevorzugen.
Greez

18.05.2011 - 08:08 Uhr

Hi Jogi,

ohne Code können wir natürlich nix sagen. Jedoch kann ich mir gut vorstellen, das der ItemTemplateSelector beim DataGrid nicht funktioniert, da du ja mehrere DataTemplates pro Rows (eines für jede cell) hast.

Was ist eigentlich der Hintergrund für diese Kommentare? Für mich macht es keinen Sinn, ein solches Vorhaben zu haben. Ein Grid soll eine Tabelle von Objekten anzeigen, die haben logischerweise auch den selben aufbau.

Was soll WPF mit dem Databinding eines solchen Items machen? Es wird nicht in der Lage sein, es in dein Objekt zu packen. Ich glaube das Control ist dafür einfach nicht ausgelegt. Wenn du es doch machen willst, dann geh doch zurück auf eine ListView und arbeite Dort mit dem ItemTemplateSelector. Das sorting müsstest du zwar selbst implementieren, aber das dürfte auch nicht das Problem sein.

Greez

17.05.2011 - 11:46 Uhr

Jo, ich hab dabei auch wieder was gelernt. Mein Code funktioniert nicht in xaml code. Man muss vielmehr die Culture auch für den XAML-Parser umstellen. Hast du fein gemacht 😉

Grüße an die mitdenkende Spezies

17.05.2011 - 10:47 Uhr

Hallo Tomcat,

das dürfte richtig sein. Du wirst aber glaube ich nicht drum herumkommen, die Entscheidung selbst zu treffen. Du könntest dir ein Custom ApplicationCommand basteln, um eine Action mit einem MemoricalKey zu verknüpfen. In der Action könntest du das Template eines ContentControls auswechseln. Wäre so eine Idee.

grüße

17.05.2011 - 10:43 Uhr

Hallo,

die Code-Behind Datei bleibt in der Regel leer. Was du später brauchst sind Converters und AttachedBehaviors. Diese werden aber normalerweise mindestens in separaten Files definiert. Ich persönlich stelle sogar einen Separaten Namespace Bereit (View.Converters und View.AttachedBehaviors).

Grüße

17.05.2011 - 10:39 Uhr

<Vermutung>Ich denke, dass StringFormat wird die Währung in der CurrentCulture binden </Vermutung>

Du solltest sicherstellen, am Anfang deines Programms deine Culture zu setzen, und soweit vorhanden, Methoden zu verwenden, die mit der Culture arbeiten. Dort solltest du die richtige Culture dann übergeben.

Da ich es nicht mehr ganz im Kopf habe, habe ich mal im Internet gesucht, der folgende Codesnip ist also ohne Gewähr. Die Culture solltest du so setzen können (theCultureString wäre dein String, also z.B. de-DE:


CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;

Gruß

17.05.2011 - 10:31 Uhr

Hallo Tomcat,

ich habe es zwar noch nie selbst benutzt, aber ich glaube, das was du suchst ist eine Viewbox.

Viewbox klicke hier

Grüßili

17.05.2011 - 09:49 Uhr

Hallo gerhut,

ich habe noch 2 Anmerkungen für dich.

  1. Warum machst du es nicht mit XAML? Du braust eigentlich keinen C#-Code daran verschwenden.
  2. Du kannst direkt auf die Klassen zugreifen, wenn du die Namespaces einbindest.

Grüßili

16.05.2011 - 15:30 Uhr

MVVM ist hier schonmal ein ganz vernünftiger Ansatz. Ich würde Daten, Logik und DataProvider wirklich voneinander trennen. Jedoch würde ich mir überlegen, ob das DataGrid in deinem Fall wirklich die optimale Wahl ist. Ein DataGrid mit vielen Spalten wird schnell unübersichtlich, evtl. ist eine Detailview übersichtlicher, wenn deine Tabellen umfangreicher werden.

Beachte bitte auch, dass das DataGrid zum Einfügen neuer Daten den Standardkonstruktor benötigt. Da in MVVM ein VM immer eine enge Bindung zum Model hat, hast du hier eine kleine Herausforderung zu lösen.

Greez

16.05.2011 - 13:04 Uhr

Hallo Fr3d1,

irgendwie gefällt mir deine Lösung nicht. Ich hatte mal eine ähnliche Aufgabenstellung. Jedoch habe ich dort alle möglichen Items von einer gemeinsamen Basisklasse ableiten lassen, sodass ich gegen die Basis binden konnte.

Der Vorteil wäre weiterhin, dass du bis auf das SelectedItem im VM keinen weiteren Code brauchst und alles über XAML abbilden kannst.

Gruß

10.05.2011 - 16:48 Uhr

Hi,

hört sich nach Web an, da bin ich nicht fachkundig. Aber unter .NET sind eigentlich alle Pages oder Items Properties Listen, in denen du Problemlos rumfummeln kannst. Also könntest auch (mit Remove) Items (Pages) entfernen.

Grüßili

27.04.2011 - 15:37 Uhr

Ich hab schon versucht mit RelativeSource wieder eine Ebene höher zu springen - also auf den View selbst. Aber dann kommt logischerweise, daß mein View diese Property auch nicht hat - die ist ja im ViewModel.

Guckst du auf dem DataContext.
Greez.

09.04.2011 - 14:13 Uhr

Hi,

laut MSDN wird die Property von RangeBase geerbt. Dort steht:

Gets or sets a value to be added to or subtracted from the Value of a RangeBase control.

Property Value
Type: System.Double
Value to add to or subtract from the Value of the RangeBase element. The default is 1.

Ein Beispiel gibt es dort nicht. Die Doku sagt an der Stelle leider nicht mehr aus, als ich bereits weiss.

Gruß

09.04.2011 - 13:12 Uhr

Guten Tag,

ich habe mir zur Vorbereitung auf das MS-Exam 70-511 das Self Training Kit zugelegt. Dort ist in Capter 1 die Rede von den wichtigen Properties der Controls Processbar und Slider.

2 davon verstehe ich nicht gänzlich. Es gibt um die Properties SmallCahnge und LargeChange, denen man wohl quasi die "Tickweite" mitgibt, also den Wert um welchen der aktuelle Wert des Controls verringert/erhöht wird.

Meine Frage ist nun: Was ist überhaupt ein LargeChange und was ist ein SmallChange und wann wie nehme ich Einfluss auf die Entscheidung ob ein Change ein SmallChange oder ein LargeChange ist.

Btw.: Im Internet habe ich die Behauptung gefunden, die Properties kämen von der Scrollbar. Stimmt dies?

Für eure Antworten danke ich euch im Vorraus.
Greez

21.02.2011 - 12:28 Uhr

Hallo herbivore,

danke, das du für mich gesucht hast. Leider sind die Probleme in den Threads nicht übertragbar auf mein Problem. Ich lese heraus, dass immer Anwendungen configuriert werden, nicht deren Teile (wie z.B. dlls). Genau das will ich auch, ich möchte in meiner dll gar keine app.config haben. Jedoch findet .NET meine Settings in der DLL nicht.

Das kopieren der Dll in die Lib ist für mich genauso wenig eine Lösung.

Eigentlich suche ich nur nach einer Lösung, meinem Wrapper (abgeleitet von ApplicationsSettingsBase) die Settings der App mitzugeben (er scheint die Settings der dll selbst zu lesen).

Grüße

21.02.2011 - 11:23 Uhr

Danke Hebivore,

der Link ist hilfreich. Ich habe allerdings hier noch ein anderes Problem: Ich würde gerne die Settings in der Exe plazieren, ausgelesen werden müssen sie allerdings von einer Lib.

Ich habe mir Wrapper geschrieben, die von ApplicationsSettingsBase ableiten, jedoch finden Sie meine Settings nicht. Ich habe gelesen, dass es einen überladenden ctor gibt, der den owner als IComponent erwartet.

Bin ich da auf dem richtigen Weg? Wie komme ich daran. Ich möchte in einer Lib die Configuration der Application laden.

Gruß

18.02.2011 - 14:12 Uhr

Guten Tag,

ich habe eine WPF Anwendung, über die ich Objekte erstelle und die in Listen packe. Aktuell werden meine Objekte über die in .NET übliche Standardinitialisierung initialisiert. Ich würde aber gerne bereits bei der Objekterstellung meine Properties über Anwendungs- oder Userspezifischen Defaultwerten belegen.

Macht man so etwas über Settings oder Configurations? Wo ist der Unterschied zwischen beiden? Es soll vorgesehen werden, dass der User die Defaultwerte überschreiben/selbst bestimmen kann.

Gruß

19.01.2011 - 20:55 Uhr

Hi,

ich habe gar keine *.exe.config datei. Das spricht für deine Vermutung, oder?
Grüße

16.01.2011 - 13:04 Uhr

Hi tabstop,

dies hatte ich getan. Leider funktioniert das nicht.
Oder anders: Es hat immer funktioniert. Nur jetzt auf einmal nicht mehr ^^

Und ich weiss nicht warum.
Ich möchte auch ungern jetzt alles hier reinkopieren, das wirkt wie Spamm. Ich hatte die App1.config in der lib und in der hauptanwendung - selbst das funktionierte nicht (sie haben den gleichen inhalt).

Grüße

15.01.2011 - 21:21 Uhr

Hi,

die Libary ist aber nicht der richtige Ort. Die Connection Strings gehören meiner Meinung nach zu den Appeinstellungen - eine solche Lib kann nicht wissen, für welche App sie eingesetzt wird.

Ich habe jedoch eine temporäre Abhilfe gefunden.
Man kann über


Database.DefaultConnectionFactory = new SqlConnectionFactory("Data Source=FLUXX\\DEVSQL;Initial Catalog=PersonDatabase;Integrated Security=SSPI;");

den Default Connectionstring setzen. Für meine Zwecke funktioniert das. Kann mir jemand sagen, ob dies auch für den Provider geht, und, ob es auch Factories für die "nicht defaultwerte" gibt?

Grüße

15.01.2011 - 11:54 Uhr

Hallo,

danke für deine Antwort. Ich hatte vergessen zu erwähnen, dass ich mit Code First arbeite. In dem Zusammenhang habe ich nur einen von DbContext abgeleitete Klasse. Das Überschreiben des Connection Strings funktioniert aber auch nicht (so wie im Internet beschrieben).

Die Models befinden sich in einer eigenen Libary. Die App1.config in der Exe. Ist dies ein Problem?

Zu der Sache mit der App1.config. Die Datei heisst so, weil der Designer sie so vorschlägt. Es ist nicht die Web/App.xaml, sondern ein Application Configuration File.

Grüße

14.01.2011 - 23:30 Uhr

verwendetes Datenbanksystem: MSSQL 2008 R2

Hi,

heute meckert EF irgendwie dass keine Verbindung zum Datenbankserver aufbaubar ist. Mir sieht es so aus, als würde er mit "Defaultwerten" arbeiten und nicht mit den Angaben in meiner App1.config.

Frage: Habe ich da in der OnModelChanged einfluss? Beziehungsweise an anderer Stelle? Ich habe eine Lösung gefunden, in der man den Basisklassenkonstruktor mit dem Namen des Add-Eintrags aus der Configuration Klasse aufruft ( also public MyContext : DbContext( "MyDataContext" ). Eine zweite Quelle behauptet der String, der dem Basisklassenkonstrutkur übergeben wird hat die form "name=..." (dies wirft jedoch direkt eine Exception, in der die Syntax angezweifelt wird.

Meine Konkrete Exception lautet:


System.Data.ProviderIncompatibleException was unhandled by user code
  Message=The provider did not return a ProviderManifestToken string.
  Source=System.Data.Entity
  StackTrace:
       ...
  InnerException: System.Data.SqlClient.SqlException
       Message=A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)
       Source=.Net SqlClient Data Provider
       ErrorCode=-2146232060
       Class=20
       LineNumber=0
       Number=-1
       Server=""
       State=0
       StackTrace:
           ...
       InnerException: 


Was ist zu tun?
Grüße

12.01.2011 - 16:33 Uhr

Bitte beantwortet die Themen nicht per PN sonder hier im Thread denn dafür ist er auch da, denn auch andere Leute die nach euch dasselbe Problem haben möchten wissen wie es gelöst wird und nicht wer per PN angesprochen werden möchte. Habt bitte dafür Versändnis, danke.

Ich kann ja verstehen, das die Dinge hier geklärt werden sollen. Jedoch muss es legitim sein, privat nachzufragen, wenn halt keine Antwort zu erwarten ist.

Grüße Fluxy.

12.01.2011 - 15:50 Uhr

Hi Ahrimaan,

wie per PN geklärt, funktioniert das ganze für MSSQL ganz gut. Dort braucht man in der OnModelCreating nix konfigurieren. Jedoch kann es bei anderen Datenbanksystemen anders sein. wie ist dort die Syntax?

Grüße

11.01.2011 - 14:21 Uhr

Hallo Rowin,

Achtung. Angeblich soll der Context nicht die DB-Connection sein, sondern eher ein Unit of Works. Der ContextProvider ist nur ein Helferlein, bei mir sähe der Code dann so aus (ist auch woanders komplett abgedruckt

   
private void ExecuteClosingCommand()
        {
            using ( var provider = new ContextProvider())
            {
                foreach (PersonViewModel p in Persons)     
                    p.AddToContext(provider); 
               
                provider.QueryContextToSaveChanges();
            }
        }

Je nach Anwendungssituation kannst du dir dann einen enuen ContextProvider (und somit einen neuen Context) erstellen. Aber wie ich schon sagte, stehe ich genau wie du sehr am Anfang meiner Erkenntnis 😉

Grüße Fluxy

11.01.2011 - 13:54 Uhr

Hallo Rahvin,

ich bin selber in der Lernphase, kann dir also nur meine Erfahrungen mitteilen. Die using solltest du, falls es geht, schon verwenden, da es explizit die Dispose-Methode aufruft (und dich dadurch dazu zwingt, am Ende wieder sauber aufzuräumen).

Leider habe ich bei meinen Tests die Erfahrung gemacht, dass es in der Regel nicht so ist, dass man den Context nur in einer Methode braucht, was using recht schwer umsetzbar macht. Ich habe dies gelöst, indem ich einen ContextProvider bereitstelle, der seinerseits den Context kapselt und selbst IDisposable implementiert.

Ich mag globales Zeugs nicht so. Ich musste hier auch schon erfahren, dass der Context zu vergleichen ist mit einem Unit of Work und kann mehrfach vorkommen.

Gruß Fluxy

11.01.2011 - 11:07 Uhr

verwendetes Datenbanksystem: MSSQL 2008 R2

Hi,

schon wieder ich.

Könntet ihr doch bitte euer wissen über 1:n und m:n Relationen in EF Code First zum besten geben? Ich habe im Internet WithMany, ManyRequired bzw. HasMany und ManyRequired gefunden.

Jedoch verstehe ich die Zusammenhänge nicht. Wann muss ich was verwenden?

Hintergrund ist folgender Code:


public class PersonManagerDataContext : DbContext
	{
		public DbSet<Person> Persons { get; set; }
		public DbSet<Address> Addresses { get; set; }

		public PersonManagerDataContext()
		{
			this.Database.CreateIfNotExists();
			Database.SetInitializer<PersonManagerDataContext>(new RecreateDatabaseIfModelChanges<PersonManagerDataContext>());
		}

        protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
        {
			
            
			modelBuilder.Entity<Person>().MapSingleType().ToTable("PersonTable");
            modelBuilder.Entity<Person>().HasKey(p => p.Id);
            modelBuilder.Entity<Person>().HasMany(p => p.Addresses).WithRequired();
			
        }
	}

Dies generiert einen Fehler, da Addresses ein Complexer Typ ist. Die Einbindung über ComplexType funktioniert wunderbar, jetzt möchte ich aber mit FK's arbeiten.

Grüße

Ich danke euch.

10.01.2011 - 15:07 Uhr

Hallo Muro,

danke für deine Antwort. Zuerst einmal ist dies eine nicht reale Testanwendung, zunächst mit nur einer Tabelle (dies bedeutet, ich habe keinen FK, lediglich einen PK, der beinhaltet in moment ein GUID.

Es geht also gar nicht um Tabellenrelationen oder Contrains. Es geht um eine simple Tabelle (Person: ID, Name, Vorname). Meine Frage ist jedoch konzeptioneller Natur. Mir geht es nicht darum diesen Fall zu lösen (das kann ich selbst), es geht mir darum, eine möglichst gute Lösung zu finden, um ein Gefühl für das EF Handling zu bekommen.

Grüße

10.01.2011 - 14:40 Uhr

Ich mach es immer so dass die Daten direkt gebunden werden, dann im DataGrid mit einem rechtsklick editiert werden können. Wenn dann die Änderungen übernommen werden kannst du SaveChanges() aufrufen ansonsten rufst du Refresh(object,RefreshMode.StoreWins) auf.

Ich mache in der Testapp nix anderes, nur das ich keine Maske zum Editieren habe. Beim Speichern gehe ich über alle Objekte und rufe Add der Entityliste im Context mit dem Objekt auf - ohne mich dafür zu interessieren, ob der user das objekt über das Grid angelegt hat, oder ob das objekt bereits aus der DB kommt (dies führt dann zu einem duplicate index).

Mir kommen da spontan mehrere Möglichkeiten

a.) man macht das Add bei der Erzeugung (das heisst das Objekt ist dem DBset von der Geburt ab bekannt, und beim speichern macht man einfach nur SaveChanges()

b.) man merkt sich, ob das Item ein "neues" item ist, und macht bei einem "alten" (also falls dieses schon in der DB existiert), kein Add.

c.) Man prüft bei einem Add über list.Contains, ob bereits ein Object mit der selben Identiy (in meinem Fall ID) bekannt ist.

Was meint ihr?
Grüße

10.01.2011 - 13:12 Uhr

Hallo,

nein, ich brauche keine Kopie. In erster Linie ist es ein Programmfehler. Ich möchte mich nicht um diese kleinigkeit kümmern, und füge beim Speichern das Objekt fehlerhafter weise in die Liste ein. Dieses Einfügen erzeugt mir ein Duplikat (logisch). Zur Not muss ich mich halt doch drum kümmern.

Andere Frage: Wann fügt man in der Regel ein Objekt der Entity-Liste hinzu? Bei der Erzeugung (also im Ctor) oder erst beim Speichern? Oder ist das Anwendungsfallabhängig?

Gruß Fluxy

08.01.2011 - 13:03 Uhr

@FZelle

Was zum Teufel soll MVVMP sein?

08.01.2011 - 12:44 Uhr

verwendetes Datenbanksystem: mySQL, MSSQL, what ever...

Hi Community,

ich habe eine kleine Verständnisfrage. Wenn ich ein neues Objekt persistieren will, muss ich über meinen Context Add aufrufen, um es in die Liste einzutragen. Änderungen am Objekt merkt EF und speichert es bei SaveChanges, soweit sogut.

Ich möchte meine Frage an einem kleinen Beispiel demonstrieren. Nehmen wir an, wir haben eine App, die (es gibt keine weiteren Tabellen) Adressen speichert. Die vorhandenen werden am Start geladen (über LINQ to Entites) und in einem DataGrid angezeigt. Am Ende werden alle im DataGrid befindlichen Daten wieder gespeichert.

Problem: Da ich Daten aus der DB gelesen habe, haben diese einen eineutigen Schlüssel - ein erneutes Add in die Entityliste ruft ein Duplicate Tupel hervor und wirft demnach einen Fehler. Man kann nun argumentieren, ich habe ein duplicate in meiner Entity Liste, das Add meckert aber auch nicht, selbst wenn ich Equals überschreibe und die Keylogik implementiere (bei mir obj.id == this.id) .

Wie verhält sich das nun? Von einem OR-Mapper erwarte ich eigentlich, dass er selbst merkt, ob er ein Insert oder Update machen muss. Damit möchte ich mich eigentlich während der Programmierung nicht auseinander setzen.

Zweite Frage: Wie verhält sich das Dbset<T>? Da es eine Collection vom Typ meines Models ist, dürfte doch eigentlich ein erneutes Einfügen eines Satzes fehlschlagen? Oder vergleicht er lediglich die Referenz?

Wie immer bin ich für Antworten dankbar.
Grüße Fluxy

08.01.2011 - 00:10 Uhr

Guten Abend,

wie einfach mal doch eine MVVM-Entfachen kann. Entschuldigt, das war nicht meine Absicht. Ich habe das Wort Repository beim Googlen von EF Tutorials auch schon gemerkt, aber geschickt überlesen. Was ist damit gemeint? Ich kenne Repositories nur im Zusammenhang von Sourceverwaltung.

Aber zurück zum Thema: Für welche Datenbank gibt es denn stand heute zuverlässige ADO .NET Connectoren? Wenn ich euch richtig verstehe, ist der MySQL-Connector schonmal was für die Mülltonne 😉

Grüße

07.01.2011 - 13:06 Uhr

Hallo,

danke für deine Antwort.
Zum Thema MySQL. Ich wollte nur nicht MS SQL nehmen. Und da springt es halt ins auge, MySQL zu nehmen, da es schön klein und handlich ist. Es geht eigentlich darum zu schauen, mit welchen Datenbanken EF klar kommt und wie es programmiertechnisch dann aussieht.

Letztendlich wird MySQL nicht zum Einsatz kommen, sondern eher Oracle oder Informix.

Die anderen Punkte muss ich mir erst anschauen.
Grüße Fluxy

06.01.2011 - 12:25 Uhr

Hallo Community,

machen wir hier mal einen Sauberen Schnitt. Ich möchte von euch 2 Dinge wissen.

1.) Ist der Code angemessener als die Verwendung eines Singletons für den DataContext

2.) Die ursprüngliche Frage: Warum meckert er mir an, das die Datenbank nicht existiert. Unter MSSQL geht es, unter MySQL nicht. Andere Provider habe ich nicht ausprobiert.

3.) Anmerkungen: Die ganze App ist im MVVM-Design. Für das Speichern der Models sind die Models selbst verantwortlich, sie bekommen den Context übergeben. Der Context wird von einem Provider gemanaged. Ich versuche den code so knapp wie möglich zu halten.

Zunächst mal die Verwendung:

 
 private void ExecuteClosingCommand()
        {
            using ( var provider = new ContextProvider())
            {
                foreach (PersonViewModel p in Persons)     
                    p.AddToContext(provider); 
               
                provider.QueryContextToSaveChanges();
            }
        }


Der Code wird ausgeführt beim Schliessen des Fensters (Stichwort Attached Behavior). Der Provider wird bis ins Model durchgereicht, wo letzentlich der Provider wieder angesprochen wird:


    public void AddToContext(ContextProvider provider)
        {
            provider.Context.Persons.Add(this);
        }

Hier der Provider


public class ContextProvider : IDisposable
    {
        private bool _disposed;

        public PersonManagerDataContext Context { get; private set; }

        public ContextProvider()
        {
            Context = DataContextFactory.CreateNewDataContext();
        }

        public void AddToContext(Person p)
        {
            Context.Persons.Add(p);
        }

        public void AddToContext(Address a)
        {
            Context.Addresses.Add(a);
        }

        public void QueryContextToSaveChanges()
        {
            Context.SaveChanges();
        }
      
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(true);
            
        }

        private void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    Context.Dispose();
                }
            }

            _disposed = true;
        }
    }

Für die Erzeugung des DataContext wird noch ein Factory verwendet, das ich aber hier nicht poste. Es tut nix unerwartetes.

So nun warte ich mal auf eure Kommentare u. Hinweise.

Grüße Fluxy

05.01.2011 - 09:51 Uhr

So, ich habe den ctor mal so geändert:


private PersonManagerDataContext()
	{
		this.Database.CreateIfNotExists();
		Database.SetInitializer<PersonManagerDataContext>(new RecreateDatabaseIfModelChanges<PersonManagerDataContext>());
	}

Er soll also am Anfang einmal die Datenbank erstellen. Trotzdem kommt beim Add in den Context, dass die Datenbank nicht existiert.

CreateIfNotExists() legt sie doch an oder?
Grüße

04.01.2011 - 22:05 Uhr

Naja,

ich sag mal so, meine Frage wurde längst beantwortet und aus der Singleton geschichte muss man keine Endlos-Story machen.

Der Fehler war, das ich die Datenbank createn muss. Dies steht ja auch in der Inner Exception.

Kann dann ein Mod den Thread bitte schließen?
Grüße Fluxy.

04.01.2011 - 13:12 Uhr

Hallo FZelle,

ich denke nicht, dass ich das Singleton-Pattern hier missbrauche, aber ich habe wohl die Verwendung des Contexts einfach missverstanden. Mein Problem ist auch, dass ich ausser 2 Tutorials nichts an Informationen habe, weil ich keine wirkliche Dokumentation finde.

Könnt ihr mir da helfen? Wisst ihr wo sie steckt? In der Msdn scheint nicht wirklich was auffindbar zu sein.

Vielleicht könntest du ja mal so nett sein und mir skizzieren, wie es richtig geht? Im konkreten Fall geht es nur darum Personen in einer Datenbank zu speichern.

Ich denke diese Singleton-Geschichte ist natürlich tragisch, wird aber vermutlich keine Auswirkungen auf die Funktionalität haben. Interessanterweise habe ich hier den Code neu aufgebaut (das Original weilt zu Hause) und bekomme nun den Fehler nicht mehr. Allerdings wird auch keine Datenbank geschrieben.

Alles was ich dafür mache ist


 private PersonManagerDataContext()
        {
            this.Database.CreateIfNotExists();
            System.Data.Entity.Infrastructure.Database.SetInitializer<PersonManagerDataContext>( new RecreateDatabaseIfModelChanges<PersonManagerDataContext>());
}

Wäre cool, wenn wir über die Singleton Sache ein weilchen einfach mal hinwegsehen könnten. Tun wir so, als wäre er nicht vorhanden^^

Grüße

04.01.2011 - 10:44 Uhr

Hi,

als Vorlage diente mir dieses Tutorial hier: Code-First Development with Entity Framework 4

Dort ist der Context nur kein Singleton, das Add macht er jedoch genauso. In dem Zusammenhang, was ist ein ActiveRecord?

Was heisst hier eigentlich mit Gewalt? Und was meinst mit nem falschen Singleton?

Grüße

03.01.2011 - 22:56 Uhr

//Update

Das Problem ist wohl, das die DB nicht existiert:

PersonManager.vshost.exe Error: 0 : Unknown database 'persondatabase'

Wenn ich die Datenbank vorher anlege, meckert er das ein SetInitializer gemacht habe, das Model sich aber verändert hat. Mache ich das, geht es wohl. Jedoch sollte er die Datenbank selbst neu erstellen oder nicht?

Grüße

03.01.2011 - 20:28 Uhr

verwendetes Datenbanksystem: mySQL

Guten Abend,

auf euren Rat hin habe ich mir EF Code First mal angeschaut. Ich bin auch recht zufrieden bis jetzt, bin allerdings an eine Stelle gekommen, wo ich nicht so recht weiterkomme.


 PersonManagerDataContext.GetContext().Persons.Add(this);

Diese Zeile (Der Context ist bei mir ein Singleton) wirft eine ProviderImcompatibleException mit dem Text "The provider did not return a ProviderManifestToken string.". Was habe ich falsch gemacht?

Das ganze ist nur eine Beispielapp zum lernen. In der App.config steht:


	<connectionStrings>
		<add name="PersonManagerDataContext" connectionString="server=localhost;User Id=root;Database=PersonDatabase;" providerName="MySql.Data.MySqlClient" />
	</connectionStrings>

Was mache ich falsch?
Vielen dank für eure Antworten.
Gruß Fluxy

02.01.2011 - 18:22 Uhr

Hallo,

danke für deine erste Antwort. Ich musste darüber etwas nachdenken, ich denke ich skizziere nochmal zur Sicherheit, die ich so sehe:

Die erste Variante ist die (ich glaube die meinst du auch), dass man die von Entity Model designer erstelle Klasse als Model verwendet (man wrappt also quasi im VM die Entities aus EF). Hat meiner Meinung nach den Nachteil, das das VM alle Daten von EF sieht.

Die andere Möglichkeit wäre, das man ein einfaches Model macht, welches das EF Model kapselt und die Properties selbst anbietet. Bedeutet denke ich mehr Programmierarbeit, dafür ist die EF-Funktionität wirklich von VM weggekapselt.

Was denkt ihr?
Grüße

28.12.2010 - 23:28 Uhr

verwendetes Datenbanksystem: irelevant, zur zeit mySQL.

Hallo Community,

ich habe mal eine rein konzeptionelle Frage. Ich arbeite in meiner Anwendung mit einer MVVM-Architektur, die folgendermaßen aufgebaut ist

  • Die App selber beinhaltet nur ServiceProvider, und registriert die entsprechenden komponenten, bindet eine View Class Library
  • Die View Class Library stellt alle Views bereit und bindet eine ViewModels Class Libary
  • Die View Models Libary stellt die Models bereit, diese sind in der Core Lib.
  • Die Core Lib definiert die Models.

Jetzt habe ich mein ADO.NET Entity Data Model, in dem irgendwie diese 3 abstraktionsschichten versteckt sind (entschuldigt, ich bin Einsteiger). Das Entity Model ist im Moment Teil meiner Core-Lib. Für die konzeptionelle Schicht muss ich ja Entity Classen schreiben. Verwendet man da direkt die Models, oder fügt man dort noch eine Abstraktionsschicht ein? Wenn zweiteres, wie realisiert man das am besten.

Grüße Fluxy

28.12.2010 - 09:10 Uhr

Hallo zusammen,

Problem gelöst.
Er kannte den Eintrag wirklich nicht. Grund ist, dass ich, wie ich schon sagte, die emdx-datei in ner Class Libary habe. Er erstellt dort eine App.config, von der weiss jedoch die Anwendung nix.

Man muss sie in die Anwendung kopieren, damit die Anwendung davon Wind bekommt.
Gruß

28.12.2010 - 08:20 Uhr

Hallo,

ich selber nicht. Aber das macht ja der Wizzard für dich, wenn ich ein ADO.NET Data Model erstellt.

In der App.config (es handelt sich um eine Class Library) steht


<?xml version="1.0" encoding="utf-8"?>
<configuration>
	<connectionStrings>
		<add name="DBConvOrganizerEntities" connectionString="metadata=res://*/DBConvOrganizerCore.csdl|res://*/DBConvOrganizerCore.ssdl|res://*/DBConvOrganizerCore.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=localhost;User Id=root;database=dbconvorganizer&quot;" providerName="System.Data.EntityClient" />
	</connectionStrings>
</configuration>

grüße

28.12.2010 - 07:44 Uhr

verwendetes Datenbanksystem:mySQL

Guten Morgen,

ich habe gestern mal versucht, ein erstes Mapping zu generieren und es geht direkt in die Hose. Ich habe eine Klasse, mit einem Property Name, was ich gegen eine Relation (Attribute id als Primary Key und Name) mappe.

Ich bekomme beim Aufruf von


databaseItemContext = new DBConvOrganizerEntities();

diese Exception

InnerException: System.ArgumentException
Message=The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid.
Source=System.Data.Entity
StackTrace:
at System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString)
at System.Data.EntityClient.EntityConnection..ctor(String connectionString)
at System.Data.Objects.ObjectContext.CreateEntityConnection(String connectionString)
at System.Data.Objects.ObjectContext..ctor(String connectionString, String defaultContainerName)
at DBConvOrganizerCore.DBConvOrganizerEntities..ctor()

27.12.2010 - 21:19 Uhr

Hallo,

ich denke ich werde mich zuerst mal mit dem EF beschäftigen. Habt ihr da ein paar Links für mich? Ich hatte mir den Schnellstart in der MSDN mal angeschaut, aber damit komme ich nicht ganz zurande. Auch für Literaturtips bin ich zu haben.

Grüße

27.12.2010 - 13:38 Uhr

Naja wir haben uns mal die Laufzeit von dem Teil angeschaut (ich muss sagen das ich nicht im Team war), und da kam wohl raus, das die Queries zu lange benötigten. Für welche Fälle ist denn allgemein NHibernate die bessere Variante, und wann bin ich mit EF besser beraten?

Bei EF habe ich natürlich den Vorteil, dass ich keine 3rd-Person-Libaries benötige oder?
Grüße

27.12.2010 - 10:00 Uhr

Auch das Entity Framework kann das, wenn es ein entsprechender Provider vorhanden ist. Dies findest du heraus wenn du bei den verschiedenen Datenbank auf der Hersteller Seite nachschaust.

Gibt es die Provider beim Anbieter selbst? Ich hatte über ein Tutorial den dotnet connector gefunden. Da gibts Trialversionen, jedoch scheinen die danach kommerziell zu sein (ich habe es noch nicht ausprobiert).

Mich würde auch interessieren, welche Erfahrungen du mit XPO gemacht hast. NHibernate fiel zunächst zwecks Performance aus dem Rennen.

@Ahrimaan: Dieses EF Code First, ist das ein aufsatz fürs Entity Framework?

Gruße Fluxy

26.12.2010 - 22:01 Uhr

Hallo Cummunity,

sowohl für die Arbeit als auch privat, suche ich nach einer Technologie, über die in einem C#-Programm Datenbankzugriffe realisieren kann. Die Anforderungen sind im einzelnen:

  1. Der Programmierer soll mit der Datenbankarbeit so wenig wie möglich zu tun haben, sich also keine Gedanken mehr darüber machen müssen, dass Funktionitäten in unterschiedlichen Datenbanken unterschiedliche Logiken (z.B. SQL-Commands) benötigen. Dies spricht eigentlich für einen O/R-Mapper.

  2. Die Schnittstelle soll alle gängigen relationalen Datenbanksysteme (von Informix und Oracle über MS SQL Server bis hin zu mysql unterstützen)

  3. Es soll möglichst kostengünstig bzw. kostenlos verfügbar sein.

  4. Die Aktionen, die in Hintergrund laufen, sollten möglichst transparent sein (ich habe eine zeit lang mal XPO (von Devexpress) im Einsatz gehabt, und mir war aufgefallen, das die vorgange dort nicht immer logisch erschienen (was die Fehlersuche extrem schwierig macht).

In die nähere Auswahl fielen neben XPO erstmal NHibernate und das Entity Framework. Mit dem Entity Framework habe ich bislang nicht viel gemacht, nur gegoogled. Dort habe ich erfahren, dass man neben der aktuellen Version von Visual Studio auch noch spezielle Connectors braucht, die wieder kommerziell vermarktet werden. Ist dies richtig?

Wäre mal cool wenn ihr euch etwas darüber auslassen könntet, damit ich anhaltspunkte für meine weitere Recherche habe.

Gruß und ein frohes Weihnachtsfest

Fluxy