Laden...

Klasse unter Navigation Property ebenfalls aktualisieren, wenn Entity aktualisiert wird

Letzter Beitrag vor 6 Jahren 5 Posts 1.485 Views
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

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.

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.

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.

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