我正在使用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属性。
我想对我的所有实体执行此操作,即使在相同的查询中也是从数据库获取的。
这可能吗?如果是这样,我该如何实现呢?
问候。
答案 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);
}
}
}
}
}
}