Laden...

Entity Framework: Ungültiger Objektname 'dbo.[Tablename]'

Erstellt von Hendrixx91 vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.931 Views
H
Hendrixx91 Themenstarter:in
11 Beiträge seit 2013
vor 10 Jahren
Entity Framework: Ungültiger Objektname 'dbo.[Tablename]'

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.

16.842 Beiträge seit 2008
vor 10 Jahren

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.

H
Hendrixx91 Themenstarter:in
11 Beiträge seit 2013
vor 10 Jahren

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.

2.207 Beiträge seit 2011
vor 10 Jahren

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.

Entity Framework Code-First:

Gruss

Coffeebean

H
Hendrixx91 Themenstarter:in
11 Beiträge seit 2013
vor 10 Jahren

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).

2.207 Beiträge seit 2011
vor 10 Jahren

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

R
212 Beiträge seit 2012
vor 10 Jahren

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.

H
Hendrixx91 Themenstarter:in
11 Beiträge seit 2013
vor 10 Jahren

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.

16.842 Beiträge seit 2008
vor 10 Jahren

Ä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.

R
212 Beiträge seit 2012
vor 10 Jahren

@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.