2016-05-26 10 views
1

Ich verwende-Code Erste und haben Einrichtungen wie diese:Wie sollte ich eine untergeordnete Entität als inaktiv markieren, anstatt sie aus der Datenbank zu löschen, aber sie müssen sich gleich verhalten?

public class Account 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int ContactId { get; set; } 
    public virtual ICollection<Contact> Contacts { get; set; } 
} 

public class Contact 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

Wenn ein Kontakt von einem Konto zu entfernen, habe ich die Zeile aus der Datenbank löschen würde. Anstatt die Zeile zu löschen, aktualisieren wir eine Statusspalte auf Inaktiv. Hier habe ich der Contact-Entität eine Status-Eigenschaft hinzugefügt:

public class Contact 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public ContactStatus Status {g et; set; } 
} 

public enum ContactStatus 
{ 
    Active = 0, 
    Inactive = 1 
} 

Inaktive Kontakte sollten sich wie aus der Datenbank gelöschte Kontakte verhalten. Der Benutzer der Website wird gehen, um den Kontakt zu löschen und es wird "verschwinden" wie zuvor.

Hier ist unsere aktuelle Lösung. Wir erstellen eine weitere Eigenschaft namens ActiveContacts:

Es gibt einige Probleme mit diesem. Geschäftslogik und Linq-Abfragen kennen die neue Status-Eigenschaft nicht. Ich suche dann den gesamten Code nach Verweisen auf die alte Eigenschaft Kontakte. Gibt es eine bessere Lösung als alle Referenzen von Kontakten zu ActiveContacts zu ändern?

Antwort

0

Hier ist das Beste, was ich mir vorstellen konnte. Zögern Sie nicht, irgendwelche Fallstricke oder Fallstricke aufzuzeigen, die bei diesem Ansatz auftreten könnten.

Ich habe die Navigationseigenschaft ContactsCollection umbenannt und das InversePropertyAttribute verwendet, um einen Verweis auf die rohe Auflistung aus der Datenbank zu verwalten. Eine Contacts-Eigenschaft gibt jetzt eine Liste der Kontakte mit dem Status Aktiv zurück.

public class Account 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int ContactId { get; set; } 

    [InverseProperty("Contact")] 
    public virtual ICollection<Contact> ContactsCollection { get; set; } 

    /// <summary> 
    /// Represents a list of all Contacts with an Active Status 
    /// </summary> 
    [NotMapped] 
    public ICollection<Contact> Contacts 
    { 
     get 
     { 
      return ContactsCollection.Where(c => c.Status == Status.Active).ToList(); 
     } 
    } 
} 

nun unter Verwendung eines anderen Namens Ich muss die Code-Basis und benennen Vorkommen Kontakte mit einer Eigenschaft nicht suchen.

Ich bekomme auch Kompilierungsfehler, wo versucht wird, die neue Kontakte-Eigenschaft nur zu erhalten oder hinzuzufügen. Ich werde der Sammlung in einer nicht kompilierten Razer-Ansicht niemals zuweisen oder hinzufügen. Das funktioniert soweit gut.