Autor Beitrag
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 27.07.14 23:26 
Moin,

ich habe drei Klassen, eine davon heißt Person und ist die Basisklasse der Anderen Pupil und Teacher.
Die Daten möchte ich in einer Datenbank abbilden und habe daher entsprechende Tabellen in der Datenbank angelegt. Pupils und Teacher haben beide als Primärschlüssel die Spalte PersonId und eine entsprechende Fremdschlüsseleinschränkung.

Nun habe ich das Model von der Datenbank aktualisieren lassen.
Im Model wird eine Fremdschlüsselbeziehung generiert.
Die habe ich entfernt, die Vererbung eingebaut, im Model in den beiden Child-Klassen die PersonId-Property entfernt und Person dann als abstrakt markiert.

Soweit so gut, nach dieser Anleitung ist das genau richtig.

Allerdings habe ich so das Problem, dass die DbSet-Properties in der Entities-Klasse immer null sind.
Wenn ich mit dem Debugger in das Entities-Objekt schaue, bekomme ich in der DbContext.Database-Property diesen Fehler angezeigt:

Zitat:
"((System.Data.Entity.DbContext)(entities)).Database.Connection" hat eine Ausnahme vom Typ "System.IO.FileLoadException" verursacht.


Kann mir da jemand helfen, oder weiß jemand, wie ich die Verwerbung richtig implementieren kann?


Gruß
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 28.07.14 20:06 
Ich habe jetzt mal ganz ohne Vererbung versucht, mit dem Entity Framework eine Datenbank-Verbindung herzustellen. Schlicht und einfach aktualisieren aus der Datenbank.

Zumindest die DbSet-Properties sind nicht mehr null, allerdings bekomme ich jetzt diesen Fehler, wenn ich sie nutzen will:


Zitat:
Ein Ausnahmefehler des Typs "System.IO.FileLoadException" ist in mscorlib.dll aufgetreten.

Zusätzliche Informationen: Die Assembly im gemischten Modus wurde während Version v2.0.50727 der Laufzeit erstellt und kann nicht während der 4.0-Laufzeit ohne zusätzliche Konfigurationsinformationen geladen werden.


Klingt für mich nach irgendeinem Versionskonflikt, mehr weiß ich aber auch nicht :/
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 29.07.14 10:03 
Hallo Palladin,

gestern im myCSharp-Forum hatte ich eine ähnliche Anfrage beantwortet: Problem mit CurrentUICulture nach Umstellung von XP (32 bit) auf Win7 (64 bit)

Der eigentliche Link: Running .NET 2 Runtime applications under the .NET 4 Runtime
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 29.07.14 21:29 
Danke für den Tipp, der hat zumindest mein Test-Projekt zum Laufen gebracht, jetzt weiß ich, dass es überhaupt funktioniert und der Fehler bei mir liegt.
In diesem Test-Projekt habe ich eine Datenbank mit dem gleichen Schema verwendet. Ich habe das Entity Model direkt aufgerufen um eine Person hinzuzufügen und anschließend Alle auszulesen.
Das hat wunderbar funktioniert.

Wenn ich jetzt aber nun meinen richtigen Projekt verwende, dann sind die DbSet-Properties immer null.
Das SQLiteConnection-Objekt existiert zwar, aber der Datenbank-Name ist nicht in den Eigenschaften zu finden - im Gegensatz zu dem Test-Projekt.

Der einzige vermutlich relevante Unterschied ist, dass das Entity Model in einem eigenen Projekt liegt und nach dem Repository-Pattern gekapselt verwendet wird.
Muss ich dabei irgendetwas beachten, das mir so nicht klar ist?
Ich habe zum Testen die Referenz mit dazu genommen, damit VS alle benötigten Dateien gleich mit kopiert und ich das nicht mehr machen muss. Da die config-Datei nicht mit kam, habe ich die nötigen config-Daten (inklusive der Verbindungszeichenfolge) in die vorhandene config-Datei gelegt.

Ich habe auch den Pfad zur Datenbank-Datei angepasst, damit er immer im lokalen Ordner sucht: |DataDirectory|\TolleDatenbank.db


Weißt du, woran das liegen kann, oder wie ich dem Fehler auf die Schliche kommen kann?


Um den Fehler zu finden, habe ich eben sogar das ganze Projekt neu aufgesetzt und dabei darauf geachtet, es genauso zu machen, wie bei dem kleinen Test-Projekt.
Alle weiteren Klassen habe ich dann schlicht kopiert, das hat aber auch nichts geändert und andere relevante Unterschiede habe ich nicht gefunden.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 30.07.14 09:17 
Sorry, aber mit dem EF kenne ich mich so gut wie gar nicht aus.

Ich habe jedoch gerade danach gesucht:
du hast auch wirklich Properties erstellt (bzw. vom Designer erstellen lassen) und keine Fields, wie unter Why is my DbContext DbSet null? ?
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mi 30.07.14 14:41 
Ich meine, ich habe dort Properties, sicher bin ich aber nicht.

Ich werde nach Feierabend mal nach schauen und melde mich dann wieder.



Edit:

Ich habe nochmal nach geschaut und ja, es sind Properties.

Ich habe den Fehler mittlerweile auch raus gefunden, es liegt nämlich daran, dass sie internal sind.
Was ich aber nicht verstehe ist, warum sie internal sind. Ich hatte bisher alles internal, aber auch das public machen und neu generieren ändert daran nichts.

Es reicht zwar, wenn ich die Properties manuell auf public setze, aber das ist ja auch nicht das Wahre, dass ich das immer nach jeder Änderung für jede Property manuell machen muss.


Edit2:

Ich habe das jetzt so gelöst, indem ich die *.Context.tt überarbeitet habe.

Ich habe in Zeile 301 die Methode string public string DbSet(EntitySet entitySet) so angepasst, dass die Ergebnis-Property public ist.
Dazu habe ich Accessibility.ForReadOnlyProperty(entitySet) durch "public" ausgetauscht.

Wenn jemand ein ähnliches Problem hat, kann er das nutzen, es funktioniert. Über eine saubere Lösung, also direkt vom Designer aus, würde ich mich aber dennoch freuen.