如何在获取期间设置实体的非映射参数的值
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);
}
}
}
}
}
}