如何在获取期间设置实体的非映射参数的值

How to set a value of a non-mapped parameter of an entity during fetch

我正在使用数据库优先 Entity Framework 并且我根据需要修改了 Model.tt 文件。现在,我所有的实体都继承自以下 class:

public class EntityBase
{
    public string CreateUser { get; set; }
    public string CancelUser { get; set; }
}

比如

public partial class Depot : EntityBase

我所有的实体都有整数类型 CreateUserId 和可为空整数类型 CancelUserId 属性。我还在使用继承自的自定义 class MyContext,因此我可以中断进程。

假设我在缓存中拥有所有有效用户,并且在我想要干预的从数据库中检索数据的任何查询执行期间,从 CreateUserId 属性 中读取值,找到匹配的用户从缓存中,最后用匹配 User 的用户名 属性 更新从 EntityBase class 继承的 CreateUser 属性 的值对象。

而且我想对所有从数据库中获取的实体执行此操作,即使在同一个查询中也是如此。

这可能吗。如果是这样,我该如何实施?

此致。

由于Augusto Barreto stated, thispost建议使用ObjectMaterialized。我刚刚在我的上下文中实现了它,如下所示:

public class TContext : ObjectContext
{
    private IQueryable<User> _allUsers;

     public MyContext()
        : base("name=MyEntities", "MyEntities")
    {
        if (this._allUsers == null || _allUsers.Count() == 0)
        {
            LoadAllUsers();
        }
    }

    private void LoadAllUsers()
    {
        ObjectSet<User> userSet = this.CreateObjectSet<User>();
        _allUsers = userSet.Where(x => x.Id > 0);
    }

    private void MyContext_ObjectMaterialized(object sender, ObjectMaterializedEventArgs e)
    {
        if (_allUsers != null & _allUsers.Count() > 0)
        {
            Type type = e.Entity.GetType();
            // Create user info
            PropertyInfo piBase = type.GetProperty("CreateUser");
            PropertyInfo piObj = type.GetProperty("CreateUserId");
            if (piBase != null && piObj != null)
            {
                int userId = (int)piObj.GetValue(e.Entity);
                User createUser = _allUsers.FirstOrDefault(x => x.Id == userId);
                if (createUser != null)
                {
                    piBase.SetValue(e.Entity, createUser.Username);
                }
            }

            piBase = type.GetProperty("CancelUser");
            piObj = type.GetProperty("CancelUserId");
            if (piBase != null && piObj != null)
            {
                int? userId = (int?)piObj.GetValue(e.Entity);
                if (userId.HasValue)
                {
                    User cancelUser = _allUsers.FirstOrDefault(x => x.Id == userId.Value);
                    if (cancelUser != null)
                    {
                        piBase.SetValue(e.Entity, cancelUser.Username);
                    }
                }
            }
        }
    }
}