将属性指定为另一个属性的属性?

时间:2017-05-02 16:54:33

标签: c# entity-framework reflection

所以我有一个带有两个属性的EF类。

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

现在,我希望能够在更改请求时将当前用户ID插入RequestedUserID。为此,我可以覆盖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; }
}

这可能或者我必须在运行时解析该属性吗?我可以使用任何类型的缓存来避免同一列中的名称多次获取属性吗?

1 个答案:

答案 0 :(得分: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"];
}