Hallo,
Folgende Umgebung:
WPF .NetCore 3.1 Projekt
Datenbank SQLite (local).
Tabellen: Person, GraduationEntry, PresentEntry
die Tabelle Person (representiert 1 Person):
Spoiler anzeigen
Tabelle GraduationEntry (representiert 1 Graduierung):
Spoiler anzeigen
Tabelle PresentEntry (representiert 1 Anwesend Eintrag):
Spoiler anzeigen
Der Context dazu:
Spoiler anzeigen
OK, soweit so gut. Die DB wird angelegt. Schaue ich nun in die DB Struktur, sehe ich auch, das EF Cascade Delete angelegt hat.
Hier am Beispiel GraduationEntry:
Verstehe ich also so, das wenn ich bei der Person aus der Auflistung der GraduationEntry einen Eintrag gerausnehme (Auflistung.Remove), das dann automatisch in der GraduationEntry Tabelle der dazugehörige Eintrag auch gelsöcht wird.
Nun, wird es aber leider nicht.
Muss ich den Eintrag selbst löschen?
Ich hab auch versucht, im Context der Tabelle GraduationEntry explizit zu sagen, das er Cascade löschen soll, bringt aber auch nichts.
Fehlermeldung kommt keine, die Person wird richtig gespeichert (upgedatet) und beim Update ist der Eintrag auch wirklich weg, aber nach neuem Start der Anwendung ist der Eintrag wieder da.
Wie lösche ich denn den Eintrag in der Tabelle wenn ich einen Eintrag aus der Auflistung entferne?
Folgende Umgebung:
WPF .NetCore 3.1 Projekt
Datenbank SQLite (local).
Tabellen: Person, GraduationEntry, PresentEntry
die Tabelle Person (representiert 1 Person):
C#-Quellcode
- public class Person : ModelBase
- {
- [Required(AllowEmptyStrings = false, ErrorMessage = "Bitte geben sie einen Vornamen an")]
- [MinLength(3)]
- [MaxLength(150)]
- public virtual string FirstName { get; set; }
- [Required(AllowEmptyStrings = false, ErrorMessage = "Bitte geben sie einen Nachnamen an")]
- [MinLength(3)]
- [MaxLength(150)]
- public virtual string LastName { get; set; }
- public virtual LoginData AcessData { get; set; }
- public virtual string FullName => $"{LastName}, {FirstName}";
- public virtual DateTime EntryDate { get; set; } = DateTime.Today;
- public virtual GenderEnum Gender { get; set; } = GenderEnum.male;
- public virtual PersonTypeEnum PersonType { get; set; } = PersonTypeEnum.Shinzan;
- public virtual int MemberId { get; set; }
- public virtual ICollection<GraduationEntry> Graduations { get; set; }
- public virtual ICollection<PresentEntry> PresentEntries { get; set; }
- public virtual bool IsAdmin { get; set; } = false;
- public Person()
- {
- Graduations = new List<GraduationEntry>();
- PresentEntries = new List<PresentEntry>();
- }
- }
- public enum GenderEnum
- {
- male,
- female
- }
- public enum PersonTypeEnum
- {
- Shinzan,
- ShinzanKids
- }
Tabelle GraduationEntry (representiert 1 Graduierung):
C#-Quellcode
Tabelle PresentEntry (representiert 1 Anwesend Eintrag):
C#-Quellcode
- public class PresentEntry : ModelBase
- {
- public virtual DateTime Date { get; set; } = DateTime.Today;
- public virtual PresentStateEnum PresentState { get; set; } = PresentStateEnum.None;
- public virtual int PersonId { get; set; }
- public virtual Person Person { get; set; }
- }
- public enum PresentStateEnum
- {
- None = 0,
- Present,
- Absent,
- Sick,
- Vacation
- }
Der Context dazu:
C#-Quellcode
- public class ShinzanDojoContext : DbContext
- {
- #region Private Member
- private readonly string _dbFile = @"sdDb.db";
- #endregion
- #region Constructor
- public ShinzanDojoContext()
- {
- }
- #endregion
- #region DbSets
- public virtual DbSet<Person> People { get; set; }
- public virtual DbSet<Graduation> Graduations { get; set; }
- #endregion
- #region Overrides
- protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
- {
- optionsBuilder.UseSqlite($"Data Source={_dbFile}");
- }
- #endregion
- }
OK, soweit so gut. Die DB wird angelegt. Schaue ich nun in die DB Struktur, sehe ich auch, das EF Cascade Delete angelegt hat.
Hier am Beispiel GraduationEntry:
SQL-Abfrage
- CREATE TABLE "GraduationEntry" (
- "Id" INTEGER NOT NULL CONSTRAINT "PK_GraduationEntry" PRIMARY KEY AUTOINCREMENT,
- "CreatedBy" INTEGER NOT NULL,
- "CreationTimeStamp" TEXT NOT NULL,
- "LastModifiedBy" INTEGER NOT NULL,
- "LastModifiedTimeStamp" TEXT NOT NULL,
- "DeletedFlag" INTEGER NOT NULL,
- "GraduationId" INTEGER NOT NULL,
- "GraduationReceived" TEXT NULL,
- "GraduationHold" TEXT NULL,
- "PersonId" INTEGER NOT NULL,
- CONSTRAINT "FK_GraduationEntry_People_PersonId" FOREIGN KEY ("PersonId") REFERENCES "People" ("Id") ON DELETE CASCADE
- )
Verstehe ich also so, das wenn ich bei der Person aus der Auflistung der GraduationEntry einen Eintrag gerausnehme (Auflistung.Remove), das dann automatisch in der GraduationEntry Tabelle der dazugehörige Eintrag auch gelsöcht wird.
Nun, wird es aber leider nicht.
Muss ich den Eintrag selbst löschen?
Ich hab auch versucht, im Context der Tabelle GraduationEntry explizit zu sagen, das er Cascade löschen soll, bringt aber auch nichts.
Fehlermeldung kommt keine, die Person wird richtig gespeichert (upgedatet) und beim Update ist der Eintrag auch wirklich weg, aber nach neuem Start der Anwendung ist der Eintrag wieder da.
Wie lösche ich denn den Eintrag in der Tabelle wenn ich einen Eintrag aus der Auflistung entferne?
"Hier könnte Ihre Werbung stehen..."