2017-05-02 2 views
0

Also ich habe eine EF-Klasse mit zwei Eigenschaften.Angeben einer Eigenschaft als Attribut einer anderen Eigenschaft?

public class MyTable 
{ 
    public DateTime Requested { get; set; } 
    public Guid RequestedUserID { get; set; } 
} 

Jetzt möchte ich in der Lage sein, den aktuellen Benutzer-ID in RequestedUserID einzufügen, wenn Gewünscht geändert wird. Um dies zu tun, kann ich EFs DbContext.SaveChanges() Ereignis überschreiben und überprüfen, ob die irgendeine modifizierte Spalte ein gegebenes Attribut hat, das meinen Code anweist, auch eine zugehörige UserID Spalte zu ändern. Beispiel Attribute Markup:

public class MyTable 
{ 
    [TrackModifingUser(UserIDColumn = nameof(RequestedUserID))] 
    public DateTime Requested { get; set; } 
    public Guid RequestedUserID { get; set; } 
} 

Und dann später in meinem DbContext.SaveChanges() Fall würde ich das Hotel mit dem Namen bekommen und seinen Wert entsprechend eingestellt.

Problem, ich wünschte, mein Attribut könnte die Eigenschaft selbst irgendwie speichern. Und damit überspringen Sie die Immobilie nach Namen. Etwas wie das.

public class MyTable 
{ 
    [TrackModifingUser(UserIDColumn = RequestedUserID)] 
    public DateTime Requested { get; set; } 
    public Guid RequestedUserID { get; set; } 
} 

Ist dies möglich oder muss ich die Eigenschaft zur Laufzeit auflösen? Gibt es irgendeine Art von Zwischenspeicherung, die ich verwenden kann, um zu vermeiden, dass die Eigenschaft mehr als einmal für die gleiche Spalte namentlich genannt wird?

Antwort

0

Wenn ich das Problem richtig verstehe, möchten Sie ein bestimmtes Feld als das Feld "Current User ID" kennzeichnen und DbContext.SaveChanges() automatisch dieses Feld auf den Wert des aktuellen Benutzers festlegen, wenn es markiert ist. Wenn das stimmt, ist dies wahrscheinlich ein guter Anwendungsfall für Schnittstellen.

public interface ITracksCurrentUser 
{ 
    Guid CurrentUserID {get;set;} 
} 

public class MyTable : ITracksCurrentUser 
{ 
    public DateTime Requested { get; set; } 
    public Guid RequestedUserID { get; set; } 

    public Guid ITracksCurrentUser.CurrentUserID 
    { 
     get { return RequestedUserID;} 
     set { RequestedUserID = value;} 
    } 
} 

public override int SaveChanges() 
{ 
    foreach(userentity in ChangeTracker.Entries().Select(e => e.Entity).OfType<ITracksCurrentUser>()) 
     userentity.CurrentUserID = Session["UserID"]; 
} 
+0

EF ist nur ein Beispiel Anwendungsfall. Das Ziel besteht darin, einzelnen Spalten zu erlauben, sich gegenseitig in einem Attribut ohne die Verwendung von 'GetPropertByName' (oder was auch immer der Methodenname ist) anzugeben. – Licht

Verwandte Themen