EF如何使用数据库中的更新值刷新Context?

时间:2017-12-27 18:08:22

标签: c# entity-framework-6 sqldependency

我有一个static Context,在更新数据库中的值后不会刷新。

以下是关于系统如何运作的一些背景知识。

enter image description here

  1. CRUD在另一个应用中完成。
  2. 保存到数据库triggers后,通知API更改。
  3. Entity的{​​{1}}获取更改的Context后,API仍保留旧值。
  4. entity做了它所需要的一切。
  5. 我正在使用APIEF 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()

    以下是我想解决的问题。

    1. 是否有更好的方法来处理和重新创建新的上下文?

    2. 在上面的第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可能有一个事件。

0 个答案:

没有答案