2017-12-01 5 views
0

Ich habe eine Klasse Benutzer. UserOne und UserTwo sind Benutzer. Ich muss alle Fremdschlüsselbeziehungen von UserTwo zu UserOne übertragen.Aktualisieren Sie alle fremden Schlüsselnavigationen in Entitätskern

Ich kann dies manuell tun, indem Sie:

userTwo.PostsCreatedByUser.ToList().ForEach(a => a.CreatedByUserId = userOne.Id); 
userTwo.NotesCreatedByUser.ToList().ForEach(a => a.CreatedByUserId = userOne.Id); 
context.SaveChanges(); 

Aber ich frage mich, ob es eine Möglichkeit, diesedynamisch zu tun war? Wenn ich mit der obigen Methode eine neue Tabelle mit einer CreatedByUserId-Spalte hinzufügen würde, müsste ich zu dieser Prozedur zurückkehren und sie mit der neuen Sammlung aktualisieren. Hier

eine übersicht der Beispielklassen:

public partial class User 
{ 
    public User() 
    { 
     PostsCreatedByUser = new HashSet<Post>(); 
     NotesCreatedByUser = new HashSet<Note>(); 
    } 

    public virtual ICollection<Posts> PostsCreatedByUser { get; set; } 
    public virtual ICollection<Notes> NotesCreatedByUser { get; set; } 
} 

public partial class Post 
{ 
    public Post() { } 

    public int CreatedByUserId { get; set; } 

    public virtual User CreatedByUser { get; set; } 
} 

public partial class Note 
{ 
    public Note() { } 

    public int CreatedByUserId { get; set; } 

    public virtual User CreatedByUser { get; set; } 
} 
+0

Ihre einzige andere Wahl scheint die Reflexion zu sein. – gldraphael

Antwort

0

Sie Reflexion Aktionen verwenden können, oder ob es Ihren Bedürfnissen satisfys, können Sie Erweiterungsmethode für User Entität wie diese schaffen;

public static class UserEntityExtensions 
{ 
    public static void ConvertRelatedEntities(this User userTwo, User userOne) 
    { 
     userTwo.PostsCreatedByUser.ToList().ForEach(a => a.CreatedByUserId = userOne.Id); 
     userTwo.NotesCreatedByUser.ToList().ForEach(a => a.CreatedByUserId = userOne.Id); 
    } 
} 

Nutzungs

userTwo.ConvertRelatedEntities(userOne); 

Wenn Sie eine andere Sammlung hinzufügen müssen, die aktualisiert werden, können Sie es zu Extension-Methode setzen. Sie können es einfacher verwalten.

+0

Hat das wirklich irgendwelche Vorteile? Sie müssen den Code für neue Sammlungen noch anpassen. Außerdem outsourcen Sie Domain-Logik, die ich lieber innerhalb der Domain-Entity behalten würde. Dies erleichtert die Aufrechterhaltung einer starken Kapselung. – mbnx

+0

Ja, der Entwickler sollte die neuen Sammlungen hinzufügen, wenn es benötigt wird. Auch "Domain-Logik outsourcen" Was genau meinst du damit ich nicht verstehen könnte? Übrigens, denke ich, sollte es einfacher sein, den Konvertierungsprozess zu verwalten. Weil der Entwickler nicht alle Codezeilen ändern muss, die den Konvertierungsprozess ausführen. Es reicht aus, nur die ConvertRelatedEntities-Methode zu ändern. – lucky

+0

In diesem exakten Fall wird das Hinzufügen von Domänenlogik in einer Erweiterungsklasse nicht schaden, Sie haben Recht. Sie können jedoch nicht auf private oder geschützte Mitglieder zugreifen. Was ist, wenn ein geschützter Zeitstempel innerhalb der Benutzereinheit aktualisiert werden sollte, wenn die Zuweisung abgeschlossen ist? Was ist, wenn die Entität für jede neu zugewiesene Sammlung ein Domänenereignis ausgeben muss? Zuweisen und Erstellen von Ereignissen sollte ein atomarer Schritt sein. Mit einer Erweiterung brechen Sie dies entweder oder müssen eine Ereignisaggregationskomponente umgehen. – mbnx

Verwandte Themen