Hallo zusammen,
ich habe ein Entity Data Model aus einer MSSQL Datenbank generiert.
Für mein Beispiel verwende ich die Tabelle tbl_Adresses (gleiche Bezeichnung im EDM).
Nun schreibe ich eine allgemeine SaveEntity Methode.
class DatabaseManager<T> where T: EntityObject
{
private readonly ObjectSet<T> _object_set;
public void SaveEntity(T argEntity)
{
_object_set = _context.CreateObjectSet<T>();
_context.Connection.Open()
_object_set.AddObject(argEntity);
_context.SaveChanges();
_context.Connection.Close();
}
}
_context ist hierbei mein EDM und T der Typ der Entität (also z.B. tbl_Adresses).
Die Methode rufe ich so auf:
DatabaseManager<tbl_Adresses> manager = new DatabaseManager<tbl_Adresses>();
tbl_Adresses adress = new tbl_Adresses();
//Wertezuweisung
//...
manager.SaveEntity(adress);
Bei der Bearbeitung von
_context.SaveChanges();
tritt dann folgender Fehler auf:
Fehlermeldung:
Ungültiger Objektname 'dbo.tbl_Adresses'
Woran kann das liegen und wie kann man das beheben?
Danke im Voraus.
Die Datenbank existiert nicht oder beim Verbindungsaufbau (Context-Erstellung) gibt es einen (inhaltlichen) Fehler.
Wie sehen die Initial-Methoden zB OnModelCreating
des Context aus?
Bzw. wo liegen die Model-Dateien der EDM?
Insgesamt sieht Dein Code aber alles andre als gut aus. Schau Dir den Repository Pattern in Zusammenhang mit dem Entity Framework an. So wie Du es aktuell verwendest sind die nächsten Fehler (zB Context Attaching) absehbar.
PS: die Variante über EDM (also über den Designer) ist obsolete und sollte mittlerweile vermieden werden. Die wird auch bald ganz raus fliegen.
Besser ist hier Code First und die FluentAPI zu verwenden. Man hat nicht nur mehr im Griff; es ist auch die aktivste Entwicklungsschine und bietet die meisten Features.
PS2: Entities werden immer im Singular benannt; Tabellen im Plural.
Zudem fehlt hier die Abstraktion, da dem Objekt egal sein muss, ob es in einer Tabelle liegt oder in einem XML-Baum.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich hab mir mal ein paar Sachen zu CodeFirst / Fluent Api durch gelesen.
Dennoch verstehe ich noch nicht so ganz, wie man das Schema, das man im Code erstellt, mit einer bestehenden Datenbank verknüpft.
Hallo Hendrixx91,
im Prinzip "gar nicht" insofern, als das das EF losgeht und in der DatenBank die Struktur (Tabellen etc.) so erstellt, wie dus im Code angegeben hast.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Hey,
Danke für die schnelle Antwort.
Hab da noch die ein oder andere Frage.
Wie und wo kann ich angeben, wo die Datenbank angelegt werden soll?
Kann ich diese Connection jedes mal neu zuweisen, ohne sie fix in eine .config zu schreiben, sodass die Datenbank auf einem Server angelegt wird, wenn sie nicht vorhanden ist, bzw. die Datenbank dem Schema zugewiesen wird, wenn sie vorhanden ist? Denn die Verbindungseinstellungen (Server, Datenbank, etc.) werden sich bei jedem Start von unserem Config-Server "geholt" (anhand des Assemblynames).
Hallo Hendrixx91,
1 Minute suchen brachte mir:
You can pass a full connection string to DbContext instead of just the database or connection string name. By default this connection string is used with the System.Data.SqlClient provider; this can be changed by setting a different implementation of IConnectionFactory onto context.Database.DefaultConnectionFactory.
aus
Data Developer Center > Learn > Entity Framework > Get Started > Connections and Models
Das sollte das sein, was du suchst.
Baue dir einen Provider oder einen Service, der dir den Connectionstring baut und zurückgibt. So kannst du das isoliert testen. Interface dazu, damit es abstrahiert ist. Dann liest du den aus und gibst ihn im Konstruktor mit.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Wenn die Datenbank nicht existiert bekommst du schon beim verbinden einen fehler.> Fehlermeldung:
Fehler bei der Anmeldung für den Benutzer **
Wenn die Tabelle nict existiert, dann > Fehlermeldung:
Der mehrteilige Bezeichner *** konnte nicht gebunden werden.
Die Fehlermeldung die du bekommst, ist wenn du z.B versuchst in einen string zu schreiben, aber die '(hochkommas) vergessen hast.
Okay..Danke. S
Soweit so gut. Nochmal eine Frage zur OnModelCreating Methode:
Was kommt darein und wann, bzw wie / wo wird sie aufgerufen?
Hab zwar n Haltepunkt in der Methode, aber beim Starten des Programms, komme ich nicht in diese Methode.
Ähm... Robin0, wir reden hier von einem ORM; hier muss man sich nicht um hochkommas kümmern.
Und die von mir besagten Fehlermeldungen können sehr wohl auftreten; auch wenn die DB nicht existiert. Das liegt an den manchmal zweifelhaften Fehlermeldungen des EF, die nicht immer 100% genau das Aussagen, was sie besagen.
Das EF legt Tabellen selbst an, sofern sie nicht existieren; da gibts nur eine Fehlermeldung, wenn man das automatiche Erstellen deaktiviert, was standardmäßig so nicht der Fall ist.
Deine Fehlermeldungen Robin0 treten auf, wenn man direkt mit SqlConnection und Co arbeitet.
Hendrixx91: http://www.entityframeworktutorial.net/
Arbeite das durch; denke es ist unnötig Dir jeden einzelnen Schritt zu erklären.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
@abt
Es kann trotzdem sein dass versucht wird einen falschen datentyp abzuspeichern.
Wenn man etwas an der Klasse "tbl_Adresses" was ändert wie aus einem string ein int macht kann der fehler aufteten.