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

时间:2015-02-15 23:47:12

标签: c# entity-framework objectcontext

我正在使用Database-First Entity Framework,我已根据需要修改了Model.tt文件。现在,我的所有实体都继承自以下类:

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

,例如

public partial class Depot : EntityBase

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

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

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

这可能吗?如果是这样,我该如何实现呢?

问候。

1 个答案:

答案 0 :(得分:0)

正如Augusto Barreto所述,this帖子建议使用ObjectMaterialized。我刚刚在我的Context中实现了它,如下所示:

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);
                    }
                }
            }
        }
    }
}