2012-04-07 15 views
1

Ich bin verwirrt, wie ich zu verwandten Entitäten mit DDD aktualisiert werde. Sagen wir, ich habe eine Mitarbeiterklasse und eine Arbeitsschaltklasse. Wie sollte ich einen bestimmten Arbeitsablauf eines bestimmten Mitarbeiters aktualisieren? Die Beziehung zwischen Employee und Workt Schedule ist One-to-Many. Unten ist der Code, den ich benutze, um einen bestimmten Arbeitsplan hinzuzufügen/zu aktualisieren.Aktualisieren von verwandten Entitäten DDD

public class Employee 
{  
    public int EmployeeId { get; set; } 
    public virtual ICollection<WorkSchedule> WorkSchedules { get; set; } 

    public WorkSchedule AddWorkSchedule(WorkSchedule workSchedule) 
    { 
     this.WorkSchedules.Add(workSchedule); 

     return workSchedule; 
    } 

    public WorkSchedule EditWorkSchedule(WorkSchedule workSchedule) 
    { 
     var originalWorkSchedule = this.WorkSchedules.FirstOrDefault(w => w.WorkscheduleId == workSchedule.WorkscheduleId); 

     originalWorkSchedule.ClockIn = workSchedule.ClockIn; 
     originalWorkSchedule.ClockOut = workSchedule.ClockOut; 

     return originalWorkSchedule; 
    } 
} 
public class WorkSchedule 
{ 
    public int WorkScheduleId { get; set; } 
    public DateTime ClockIn { get; set; } 
    public DateTime ClockOut { get; set; } 

    public int EmployeeId { get; set; } 
} 

Ist das korrekt? Habe ich DDD richtig verstanden? Auch mein Denken ist gerade jetzt Workschedule ein Wertobjekt, aber ich stelle und ID für die Normierung

Antwort

0

Ihr Modell sollte „POCO“ Klasse

CRUD Methoden wie sein .. oder bearbeiten hinzufügen wird Considored im Rahmen von „Service“ oder „Repository“

hier ist eine kurze Idee, die mir in den Sinn kam gerade/wie es sein und seine Verwendung aussehen sollte ..

IRepository repository { get; set; } //implement Interface and inject via IoC Container 

//..usage 
var employee = repository.GetEmployee(123); //get by id 
//..new WorkSchedule 
employee.WorkSchedules.Add(workSchedule); 

var result = repository.Save(employee); 
+0

Ich dachte diese Methode auch, aber ich bin verwirrt, da workschedule kann nicht ohne Mitarbeiter existieren, deshalb habe ich eine Add-Methode für die Employee-Klasse erstellt. Die Add-Methode fügt nur den Arbeitsschedule in der Liste nicht auf dem DB hinzu – gnaungayan

+0

Es ist Model Validation (WorkSchedule.EmployeeId kann nicht NULL sein). Sie können 'System.ComponentModel.DataAnnotations' verwenden oder' IValidatableObject' in Ihrem Modell implementieren. damit die 'Save()' Methode das Modell vor dem Speichern validieren kann. siehe [Entity Framework 4.1 Validierung] (http://msdn.microsoft.com/en-us/data/gg193959) – aifarfa

+0

Sie sagen also, es ist der gleiche Fall mit Orders und OrderLines – gnaungayan

0

Da hier alles EF bezogen ist, ist es nicht viel von DDD. Wenn der Code wie gewünscht funktioniert, ist es in Ordnung. Aber DDD hat keine Beziehung zu EF oder irgendeinem anderen ORM. Sie sollten die Domänenobjekte entwerfen, ohne sich um die Datenbank oder ein ORM zu kümmern. Dann ordnen Sie im Repository die Domain-Entitäten den Persistenz-Entitäten zu, die vom ORM verarbeitet werden.

Auch mein Denken ist gerade jetzt Workschedule ein Wertobjekt, aber ich stelle und ID für die Normierung

Dies ist die Folge, wenn die Schichten und Modelle gemischt werden. Sie benötigen keine ID in der Domäne, aber Sie benötigen eine ID für die Persistenz. Der Versuch, beide Anforderungen in ein Modell zu integrieren und diese Modelldomäne aufzurufen, führt zu nichts.

+0

Eigentlich bin ich nicht auf ORM hier ist meine DAL ziemlich erweiterbar, wobei ich jederzeit NH, EF usw. implementieren kann. Danke – gnaungayan

+0

Ihr hier gezeigter Code ist eindeutig auf ein ORM zugeschnitten, ansonsten verstehe ich nicht, warum der WorkSchedules virtuell ist und einen öffentlichen Setter hat. Übrigens, es gibt keine harten Regeln in DDD. Die Regeln werden von der Domäne selbst definiert, so dass Sie am besten wissen sollten, ob der Code das tatsächliche Lebensproblem modelliert, das Sie lösen möchten. Auch wenn der WorkSchedule ein Wertobjekt ist, sollte es unveränderlich sein, also keine öffentlichen Setter. – MikeSW

+0

Danke Mike Ich denke, ich sehe die "Glühbirne" hier – gnaungayan

0

EF es ist nicht für DDD, es ist zu ungeschickt. EF ist für die gleichen Codemonkeys, die SQL-Tabellen zu Entities zuordnen und es wie ActiveRecord-Antipatter machen, aber nachdem intelligentere Entwickler dies als eine schlechte Praxis zu bezeichnen begannen, begannen sie, ORM, Entities zu verwenden und Monkey-Coding fortzusetzen.

Ich kämpfe mit EF letzte 3 Jahre, um es DDD Weg arbeiten zu lassen. Es widersteht erfolgreich und gewinnt. Ohne Hacks funktioniert es nicht. Die auf-zu-viele-Beziehungen funktionieren immer noch nicht wie erwartet, es gibt keine Möglichkeit, Entitäten mit Konstruktor zu erstellen, nicht die öffentlichen Eigenschaften und so weiter.

Verwandte Themen