myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Datentechnologien » Wieso gibt es im EFCore einen Fehler auf einer Spalte ('TB_AccountId'), die es gar nicht gibt?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wieso gibt es im EFCore einen Fehler auf einer Spalte ('TB_AccountId'), die es gar nicht gibt?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Taucher
myCSharp.de-Mitglied

Dabei seit: 26.01.2008
Beiträge: 286
Entwicklungsumgebung: VS 2013


Taucher ist offline

Wieso gibt es im EFCore einen Fehler auf einer Spalte ('TB_AccountId'), die es gar nicht gibt?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

verwendetes Datenbanksystem: <Sql Server 2008>

Hallo Leute,
ich bin gerade dran das Entity Core Framework zu benutzen, und habe auch gleich ein Problem das ich nicht nachvollziehen kann. Und zwar bekomme ich die im Titel angegebene Fehlermeldung. Eigentlich eindeutig. Aber dieser Spaltennamen wird überhaupt nicht benutzt, und den gibt es auch nicht.
Hier noch die Methode wo der Fehler auftaucht:

C#-Code:
public void CreateModule(string moduleId, string moduleName)
        {
            using (LoginSystemContext context = new LoginSystemContext())
            {
                TB_ModuleId module = new TB_ModuleId();
                module.ModuleId = moduleId;
                module.ModuleName = moduleName;

                context.TB_ModuleId.Add(module);

                using (TransactionScope scope = TransactionScopeManager.Current.BuildTransactionScope())
                {
                    context.SaveChanges();
                    scope.Complete();
                }
            }
        }

Der Fehler tritt bei context.SaveChanges() auf.
Jetzt meine Frage, wie um alles in der Welt kommt das Entity auf diesen Spaltennamen?
Es gibt zwar eine Tabelle TB_Account, aber auch dort wird der Spaltenname nicht benutzt, und den gibts da auch nicht.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Taucher am 30.07.2020 17:09.

30.07.2020 17:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.566
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Meine Glaskugel ist gerade in Reperatur, deshalb wird es noch dauern bis eine Antwort kommt.
Aber mal ernst, wie soll jemand der dein Projekt nicht kennt, den Code auch nicht sieht, dir bei solch einem Problem eine Antwort geben?

Den Fehler gibt es ja nicht ohne Grund.
Hier musst du mal schauen wie der Context aufgebaut ist bzw. welche Daten er verwaltet.
Irgendwo muss es ja die Spalte geben, selbst wenn diese nur irgendwo beim Model Builden falsch konfiguriert wurde.

T-Virus
30.07.2020 17:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Taucher
myCSharp.de-Mitglied

Dabei seit: 26.01.2008
Beiträge: 286
Entwicklungsumgebung: VS 2013

Themenstarter Thema begonnen von Taucher

Taucher ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das ist ja das Problem, die Spalte gibt es nirgends!
Hier der ganze Code:

C#-Code:
internal class LoginSystemContext : DbContext
    {
        public DbSet<TB_Account> TB_Account { get; set; }
        public DbSet<TB_LoginInformation> TB_LoginInformation { get; set; }
        public DbSet<TB_ModuleId> TB_ModuleId { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder options)
                => options.UseSqlServer("server=.;database=LoginSystem;trusted_connection=true;");
    }

internal class TB_Account
    {
        #region properties...
        public int Id { get; set; }
        public string LoginName { get; set; }
        public string Password { get; set; }
        public DateTime CDate { get; set; }
        public ICollection<TB_AccountData> AccountData { get; set; }
        public ICollection<TB_ModuleId> ModuleIds { get; set; }
        #endregion
    }

internal class TB_ModuleId
    {
        #region properties...
        public int Id { get; set; }
        public string ModuleId { get; set; }
        public string ModuleName { get; set; }
        #endregion
    }

internal class TB_LoginInformation
    {
        #region properties...
        public int Id { get; set; }
        public int AccountId { get; set; }
        public int ModuleIdId { get; set; }
        public DateTime LoginDate { get; set; }
        public DateTime LogoutDate { get; set; }
        public string SessionId { get; set; }
        #endregion
    }

Und in der Datenbank gibt es diese Spalte nicht! Deshalb bin ich auch völlig Ratlos.
Mehr Code gibt es dazu nicht...
30.07.2020 18:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.566
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das Problem dürfte banal sein, dass du in der Klasse TB_ModuleId keine AccountId verlinkt hast.
Die Klasse muss aber einen Verwais auf TB_Account haben, da du TB_ModuleId als Collection in TB_Account verwendest.
In TB_LoginInformation hast du diese Verbindung scheinbar mit AccountId hergestellt.
Hier fehlt auch ein ordentlicher Model Build über OnModelCreating um eine saubere Beschreibung zu haben, wie die Klassen zusammen arbeiten sollen.
Zwar versucht EntityFramework hier selbst schon die Bezüge zu bekommen, aber dies funktioniert nicht immer so wie gewünscht.
Deshalb solltest du die Methode ebenfalls implemtieren und deine Modelle richtig beschreiben.

T-Virus
30.07.2020 19:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.013
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hinweis und Basics .NET / Datenbanken: man verwendet kein Datetime sondern DateTimeOffset.
31.07.2020 11:50 Beiträge des Benutzers | zu Buddylist hinzufügen
Taucher
myCSharp.de-Mitglied

Dabei seit: 26.01.2008
Beiträge: 286
Entwicklungsumgebung: VS 2013

Themenstarter Thema begonnen von Taucher

Taucher ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Hier fehlt auch ein ordentlicher Model Build über OnModelCreating um eine saubere Beschreibung zu haben

Danke, daran lags!

Zitat:
Hinweis und Basics .NET / Datenbanken: man verwendet kein Datetime sondern DateTimeOffset

Hab ich noch nie gehört ;)
Aber danke, ich werde das demnächst berücksichtigen!
31.07.2020 16:27 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.013
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Taucher:
Hab ich noch nie gehört ;)

Ist seit .NET 2.0 so; also so ca. 17 Jahren.

 Choose between DateTime, DateTimeOffset, TimeSpan, and TimeZoneInfo

Es gilt bei Applikationen der Rat, immer DateTimeOffset zu nutzen.

Zitat:
These uses for DateTimeOffset values are much more common than those for DateTime values. As a result, consider DateTimeOffset as the default date and time type for application development.

Bei Datenbanken führt die Verwendung von DateTime zu Fehlern, weil DateTime weder den vollständigen Zeitrange unterstützt noch Zeitzonen.

=>  Do not generally recommend DateTime for Databases
01.08.2020 08:20 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 09.08.2020 19:05