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.
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.
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...
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.
Hinweis und Basics .NET / Datenbanken: man verwendet kein Datetime sondern DateTimeOffset.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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!
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code