我有一个static
Context
,在更新数据库中的值后不会刷新。
以下是关于系统如何运作的一些背景知识。
CRUD
在另一个应用中完成。triggers
后,通知API
更改。Entity
的{{1}}获取更改的Context
后,API
仍保留旧值。entity
做了它所需要的一切。我正在使用API
和EF 6.1.3
以下是使用.net 4.6.1
处理数据库触发器的代码。
SqlTblDependency
这是上面评论中的扩展方法
public class ActivityListner : DataBaseListiner<Activity>
{
private IActivityService _activityService;
public ActivityListner(IActivityService actService) : base("Activity")
{
actService.ThrowIfNull("Activity Service not passed in DI container");
_activityService = actService;
}
public override void OnChange(object sender, RecordChangedEventArgs<Activity> e)
{
var changedEntity = e.Entity;
//does not get latest data
var activity = _activityService.GetActivityByID(changedEntity.ActivityID);
//these 2 methods work but are not ideal
// 1._activityService = DependencyResolver.Current.GetService<IActivityService>();
// 2. I call Context.Refresh extention method in the GetActivityByID() call above
if (e.ChangeType == TableDependency.Enums.ChangeType.Insert)
{
//...
}
else if (e.ChangeType == TableDependency.Enums.ChangeType.Update)
{
//...
}
else if (e.ChangeType == TableDependency.Enums.ChangeType.Delete)
{
//...
}
}
}
这是public static class ContextHelpers
{
public static void RefreshContext(this MyContext ctx)
{
var context = ((IObjectContextAdapter)ctx).ObjectContext;
var refreshableObjects = ctx.ChangeTracker.Entries().Select(c => c.Entity).ToList();
context.Refresh(RefreshMode.StoreWins, refreshableObjects);
}
}
方法
GetActivityByID()
以下是我想解决的问题。
是否有更好的方法来处理和重新创建新的上下文?
在上面的第3步中,哪里是新环境的最佳位置?当我从数据库中读取 public Activity GetActivityById(Guid actId)
{
Context.RefreshContext();
var act = Context.Activities.FirstOrDefault(x => x.ActivityID == actId);
return act;
}
时,Entity Framework
是否会触发Event
?如果不可能,我可以从中心位置刷新Dispose and re-create a new context
吗?我想在Context
内部刷新或创建GenericRepository
,但我希望EF可能有一个事件。