Laden...

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

Erstellt von Taucher vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.096 Views
T
Taucher Themenstarter:in
307 Beiträge seit 2008
vor 3 Jahren
Wieso gibt es im EFCore einen Fehler auf einer Spalte ('TB_AccountId'), die es gar nicht gibt?

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:


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.

T
2.219 Beiträge seit 2008
vor 3 Jahren

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

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

T
Taucher Themenstarter:in
307 Beiträge seit 2008
vor 3 Jahren

Das ist ja das Problem, die Spalte gibt es nirgends!
Hier der ganze 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...

T
2.219 Beiträge seit 2008
vor 3 Jahren

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

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.807 Beiträge seit 2008
vor 3 Jahren

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

T
Taucher Themenstarter:in
307 Beiträge seit 2008
vor 3 Jahren

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

Danke, daran lags!

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!

16.807 Beiträge seit 2008
vor 3 Jahren

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.

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