2017-05-02 9 views
0

私は2つのプロパティを持つEFクラスを持っています。プロパティを別のプロパティの属性として指定しますか?

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

は今、私が変更されたときに要求さRequestedUserIDに、現在のユーザーIDを挿入することができるようにしたいです。これを行うには、EFのDbContext.SaveChanges()イベントをオーバーライドして、変更された列に特定の属性があるかどうかをチェックして、コードに関連するUserID列を変更するように指示します。

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

をし、後で私のDbContext.SaveChanges()イベントで、私は名前によって財産になるだろうし、それに応じてその値を設定します。例は、マークアップ属性。

問題は、私のアトリビュートが何らかの形でプロパティ自体を格納できることを望みます。そして、それをスキップすると、名前でプロパティを探しています。このようなもの。

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

が、これは可能ですか私は、実行時にプロパティを解決する必要がありますか?同じ列に対して名前を複数回指定するのを避けるために使用できるキャッシュはありますか?

答えて

0

問題を正しく理解している場合は、特定のフィールドに「現在のユーザーID」フィールドとしてラベルを付け、DbContext.SaveChanges()がそのフィールドをタグ付きの場合は自動的に現在のユーザーの値に設定します。これが正しい場合、これはおそらくインタフェースの良いユースケースです。

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は単なる使用例です。目的は、個々の列が 'GetPropertByName'(またはメソッド名が何であれ)を使わずに属性内でお互いを指定できるようにすることです。 – Licht

関連する問題