Laden...

Klasse unter Navigation Property ebenfalls aktualisieren, wenn Entity aktualisiert wird

Erstellt von Blue_Dragon vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.421 Views
B
Blue_Dragon Themenstarter:in
198 Beiträge seit 2005
vor 5 Jahren
Klasse unter Navigation Property ebenfalls aktualisieren, wenn Entity aktualisiert wird

verwendetes Datenbanksystem: MSSQL Server mit Entity Framework

Hallo Leute,

Ich versuche mit Entity Framework ein Objekt, dass unterschiedliche Referenzen auf andere Objekte hält zu speichern. Alle Objekte sind als eigene Tabellen in der Datenbank durch Code-First angelegt worden.

Mein Code zum speichern ist folgender:

project.Projectleader = db.Employees.Where(e => e.EmployeeID == new Guid(Projectleader)).FirstOrDefault();
                project.Customer = db.Customers.Where(c => c.CustomerID == project.CustomerID).FirstOrDefault();

                db.Entry(project).State = EntityState.Modified;
                
                db.SaveChanges();

Die Definition meiner Project Klasse sieht so aus:

    public class Project
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid ProjectID { get; set; }
        
        .......

        public virtual ICollection<Employee> ProjectMembers { get; set; }
        public virtual ICollection<Content> Content { get; set; }
        public virtual ICollection<Task> Tasks { get; set; }
        [DisplayName("Projektleiter")]
        public Employee Projectleader { get; set; }
        [DisplayName("Kunde")]
        public Customer Customer { get; set; }

        public Guid? CustomerID { get; set; }

    }

Der Customer wird ohne Probleme gespeichert, den Projctleader updated er allerdings nie.

Habt Ihr einen Tipp für mich, an was das liegen kann? Der Projectleader wird in der DB Suche auf jeden Fall gefunden und bevor db.SaveChanges() aufgerufen wird, ist das Projectleader Property auch gesetzt. Es wird nur nicht mit in die DB geschrieben

B
Blue_Dragon Themenstarter:in
198 Beiträge seit 2005
vor 5 Jahren

Hallo,

Bin gerade selbst auf die Lösung gekommen. Hab den Wald vor lauter Bäumen nicht gesehen und vergessen den ForeignKey zu deklarieren.

Die Korrekte Lösung ist natürlich folgende:


        public virtual ICollection<Employee> ProjectMembers { get; set; }
        public virtual ICollection<Content> Content { get; set; }
        public virtual ICollection<Task> Tasks { get; set; }
        [DisplayName("Projektleiter")]
        public virtual Employee Projectleader { get; set; }
        [DisplayName("Kunde")]
        public Customer Customer { get; set; }

        [ForeignKey("Projectleader")]
        public Guid? ProjectleaderID { get; set; }
        public Guid? CustomerID { get; set; }

Thread kann also gelöscht werden.

16.807 Beiträge seit 2008
vor 5 Jahren

Tipp: verzichte auf die Attribute und verwende Fluent Code.
Liest sich einfacher, ist einfacher zu warten und ohne Attribute hast Du entsprechend auch echte POCOs.

5.299 Beiträge seit 2008
vor 5 Jahren

hmm - zu "Fluent Code" erbrachte Google mir folgendes:
https://www.red-gate.com/simple-talk/dotnet/net-framework/fluent-code-in-c/
Ich sehe nicht, wie das dem TE helfen könnte.
Meinst du vlt. ein anderes "Fluent Code", und wenn ja welches?

Der frühe Apfel fängt den Wurm.

P
441 Beiträge seit 2014
vor 5 Jahren

Gemeint ist vermutlich die Fluent API von Entity Framework zur Konfiguration der Entitäten.

Für EFCore z.B. hier: http://www.entityframeworktutorial.net/efcore/fluent-api-in-entity-framework-core.aspx