void ZkDataContextOnAfterEntityChange(object sender, ZkDataContext.EntityEntry dbEntityEntry) { // Invalidates cache on entity changes var post = dbEntityEntry.Entity as ForumPost; if (dbEntityEntry.State != EntityState.Added && dbEntityEntry.State != EntityState.Modified) { return; } if (post != null) { MvcHtmlString dummy; cache.TryRemove(GetKey(post, true), out dummy); cache.TryRemove(GetKey(post, false), out dummy); } else { var news = dbEntityEntry.Entity as News; if (news != null) { MvcHtmlString dummy; cache.TryRemove(GetKey(news, true), out dummy); cache.TryRemove(GetKey(news, false), out dummy); } } }
void ZkDataContextOnAfterEntityChange(object sender, ZkDataContext.EntityEntry dbEntityEntry) { var post = dbEntityEntry.Entity as ForumPost; if (post != null && (dbEntityEntry.State == EntityState.Added || dbEntityEntry.State == EntityState.Modified)) { IndexPost(post); } }
private void ZkDataContextOnAfterEntityChange(object sender, ZkDataContext.EntityEntry entityEntry) { if (entityEntry.State == EntityState.Deleted || entityEntry.State == EntityState.Unchanged) { return; } var entity = entityEntry.Entity; if (entity is ForumPost && entityEntry.State == EntityState.Added) { // forum post got added, distribute to connected users var post = (ForumPost)entity; var changedThreadID = post.ForumThreadID; using (var db = new ZkDataContext()) { var t = db.ForumThreads.Find(changedThreadID); if (t != null) { var item = new ForumItem() { Time = t.LastPost ?? t.Created, Url = $"{GlobalConst.BaseSiteUrl}/Forum/Thread/{t.ForumThreadID}", Header = t.Title, IsRead = false }; foreach (var user in server.ConnectedUsers.Values.Where(x => x != null && x.IsLoggedIn)) { var list = GetCurrentForumList(user.User.AccountID); var existing = list.ForumItems.FirstOrDefault(x => x.Url == item.Url); if (existing != null) { existing.Header = item.Header; existing.IsRead = post.AuthorAccountID == user.User.AccountID; existing.Time = item.Time; } else { list.ForumItems.Add(item); } list.ForumItems = list.ForumItems.OrderByDescending(x => x.Time).ToList(); user.SendCommand(list); } } } } else if (entity is ForumThreadLastRead) { // someone read some thread var changedAccountID = ((ForumThreadLastRead)entity).AccountID; var readThreadID = ((ForumThreadLastRead)entity).ForumThreadID; var conus = server.ConnectedUsers.Values.FirstOrDefault(x => x != null && x.User.AccountID == changedAccountID && x.IsLoggedIn); if (conus != null) { var list = GetCurrentForumList(changedAccountID); if (list.ForumItems.Any(x => x.ThreadID == readThreadID)) // the thread is in top 10, update list { list = CachePrivateForumList(changedAccountID); conus.SendCommand(list); } } } else if (entity is ForumThread) { var thread = (ForumThread)entity; if (entityEntry.State == EntityState.Added) // thread added force refresh { CachePublicForumList(); } else { var existing = cachedPublicForumList.ForumItems.FirstOrDefault(x => x.ThreadID == thread.ForumThreadID); if (existing != null) // top 10 thread modified { if (existing.Time < thread.LastPost) { CachePublicForumList(); // it gotten a new post, update } } else { if (thread.LastPost >= cachedPublicForumList.ForumItems.Min(x => (DateTime?)x.Time)) { CachePublicForumList(); // its a modified post and its date belongs to top 10, update } } } } }