public static Node GetNode(int nodeId, Server.ServerDbContext serverDbContext, Databases database)
        {
            Node result = null;

            var node = serverDbContext.Node
                       .Include("NodeGroup").Include("NodeGroup.Router")
                       .Include("NodeGroup.Router.TargetNode").Include("NodeGroup.Router.TargetNode.NodeGroup")
                       .Include("Router.SourceNodeGroup.Node")
                       .SingleOrDefault(n => n.Id == nodeId);

            if (node != null)
            {
                var projectId = node.NodeGroup.ProjectId;
                var router    = node.NodeGroup.Router.SingleOrDefault(x => x.ProjectId == projectId);
                if (router == null)
                {
                    result = new MasterNode(database, node);
                }
                else
                {
                    result = new Node(database, node);
                }
            }

            return(result);
        }
        public static bool Router(MasterDbContext masterDbContext, Server.ServerDbContext serverDbContext)
        {
            var oldRouters = masterDbContext.SymRouter.Select(x => x).ToDictionary(x => x.RouterId, x => x);
            var newRouters = serverDbContext.Router.Include("SourceNodeGroup").Include("TargetNode.NodeGroup").Select(x => x).ToDictionary(x => x.RouterId, x => x);

            DateTime dateTimeNow = DateTime.Now;

            foreach (var router in newRouters)
            {
                if (!oldRouters.ContainsKey(router.Key))
                {
                    // 新增
                    masterDbContext.SymRouter.Add(new SymRouter
                    {
                        RouterId          = router.Value.RouterId,
                        SourceNodeGroupId = router.Value.SourceNodeGroup.NodeGroupId,
                        TargetNodeGroupId = router.Value.TargetNode.NodeGroup.NodeGroupId,
                        RouterType        = "default",
                        CreateTime        = dateTimeNow,
                        LastUpdateTime    = dateTimeNow
                    });
                }
                else
                {
                    // 修改
                    var oldRouter = oldRouters[router.Key];
                    oldRouter.SourceNodeGroupId = router.Value.SourceNodeGroup.NodeGroupId;
                    oldRouter.TargetNodeGroupId = router.Value.TargetNode.NodeGroup.NodeGroupId;
                    oldRouter.CreateTime        = dateTimeNow;
                    oldRouter.LastUpdateTime    = dateTimeNow;
                }
            }

            foreach (var router in oldRouters)
            {
                if (!newRouters.ContainsKey(router.Key))
                {
                    // 刪除
                    masterDbContext.SymRouter.Remove(router.Value);
                }
            }

            bool result = false;

            try
            {
                masterDbContext.SaveChanges();
                result = true;
            }
            catch (Exception e)
            {
                LogException(nameof(Router), e);
            }

            return(result);
        }
        public static bool Channel(MasterDbContext masterDbContext, Server.ServerDbContext serverDbContext)
        {
            var oldChannels = masterDbContext.SymChannel.Select(x => x).ToDictionary(x => x.ChannelId, x => x);
            var newChannels = serverDbContext.Channel.Select(x => x).ToDictionary(x => x.ChannelId, x => x);

            foreach (var channel in newChannels)
            {
                if (!oldChannels.ContainsKey(channel.Key))
                {
                    // 新增
                    masterDbContext.SymChannel.Add(new SymChannel
                    {
                        ChannelId       = channel.Value.ChannelId,
                        ProcessingOrder = 1,
                        MaxBatchSize    = 100000,
                        Enabled         = 1,
                        Description     = channel.Value.Description
                    });
                }
                else
                {
                    // 修改
                    var oldChannel = oldChannels[channel.Key];
                    oldChannel.Description = channel.Value.Description;
                }
            }

            foreach (var channel in oldChannels)
            {
                if (new string[] { "config", "reload", "monitor", "heartbeat", "default", "dynamic" }.Contains(channel.Key))
                {
                    continue;
                }

                if (!newChannels.ContainsKey(channel.Key))
                {
                    // 刪除
                    masterDbContext.SymChannel.Remove(channel.Value);
                }
            }

            bool result = false;

            try
            {
                masterDbContext.SaveChanges();
                result = true;
            }
            catch (Exception e)
            {
                LogException(nameof(Channel), e);
            }

            return(result);
        }
        public static bool Relationship(MasterDbContext masterDbContext, Server.ServerDbContext serverDbContext)
        {
            var oldTriggerRouters = masterDbContext.SymTriggerRouter.Select(x => x).ToDictionary(x => string.Format("[{0}][{1}]", x.TriggerId, x.RouterId), x => x);
            var newTriggerRouters = serverDbContext.TriggerRouter.Include("Trigger").Include("Router").Select(x => x).ToDictionary(x => string.Format("[{0}][{1}]", x.Trigger.TriggerId, x.Router.RouterId), x => x);

            DateTime dateTimeNow = DateTime.Now;

            foreach (var triggerRouter in newTriggerRouters)
            {
                if (!oldTriggerRouters.ContainsKey(triggerRouter.Key))
                {
                    // 新增
                    masterDbContext.SymTriggerRouter.Add(new SymTriggerRouter
                    {
                        TriggerId        = triggerRouter.Value.Trigger.TriggerId,
                        RouterId         = triggerRouter.Value.Router.RouterId,
                        InitialLoadOrder = 200,
                        LastUpdateTime   = dateTimeNow,
                        CreateTime       = dateTimeNow
                    });
                }
                else
                {
                    // 修改
                    var oldTriggerRouter = oldTriggerRouters[triggerRouter.Key];
                    oldTriggerRouter.LastUpdateTime = dateTimeNow;
                    oldTriggerRouter.CreateTime     = dateTimeNow;
                }
            }

            foreach (var triggerRouter in oldTriggerRouters)
            {
                if (!newTriggerRouters.ContainsKey(triggerRouter.Key))
                {
                    // 刪除
                    masterDbContext.SymTriggerRouter.Remove(triggerRouter.Value);
                }
            }

            bool result = false;

            try
            {
                masterDbContext.SaveChanges();
                result = true;
            }
            catch (Exception e)
            {
                LogException(nameof(Relationship), e);
            }

            return(result);
        }
        public static bool NodeGroups(INode node, MasterDbContext masterDbContext, Server.ServerDbContext serverDbContext)
        {
            var oldNodeGroups = masterDbContext.SymNodeGroup.Select(x => x).ToDictionary(x => x.NodeGroupId, x => x);
            var newNodeGroups = serverDbContext.NodeGroup.Where(ng => ng.ProjectId == node.ProjectId).ToDictionary(x => x.NodeGroupId, x => x);

            foreach (var nodeGroup in newNodeGroups)
            {
                if (!oldNodeGroups.ContainsKey(nodeGroup.Key))
                {
                    // 新增
                    masterDbContext.SymNodeGroup.Add(new SymNodeGroup
                    {
                        NodeGroupId = nodeGroup.Value.NodeGroupId,
                        Description = nodeGroup.Value.Description
                    });
                }
                else
                {
                    // 修改
                    var oldNodeGroup = oldNodeGroups[nodeGroup.Key];
                    oldNodeGroup.Description = nodeGroup.Value.Description;
                }
            }

            foreach (var nodeGroup in oldNodeGroups)
            {
                if (!newNodeGroups.ContainsKey(nodeGroup.Key))
                {
                    // 刪除
                    masterDbContext.SymNodeGroup.Remove(nodeGroup.Value);
                }
            }

            bool result = false;

            try
            {
                masterDbContext.SaveChanges();
                result = true;
            }
            catch (Exception e)
            {
                LogException(nameof(NodeGroups), e);
            }

            return(result);
        }
        public static bool Triggers(MasterDbContext masterDbContext, Server.ServerDbContext serverDbContext)
        {
            var oldTriggers = masterDbContext.SymTrigger.Select(x => x).ToDictionary(x => x.TriggerId, x => x);
            var newTriggers = serverDbContext.Trigger.Include("Channel").Select(x => x).ToDictionary(x => x.TriggerId, x => x);

            DateTime dateTimeNow = DateTime.Now;

            foreach (var trigger in newTriggers)
            {
                if (!oldTriggers.ContainsKey(trigger.Key))
                {
                    // 新增
                    masterDbContext.SymTrigger.Add(new SymTrigger
                    {
                        TriggerId           = trigger.Value.TriggerId,
                        SourceTableName     = trigger.Value.SourceTableName,
                        ChannelId           = trigger.Value.Channel.ChannelId,
                        ReloadChannelId     = "reload",
                        SyncOnUpdate        = 1,
                        SyncOnInsert        = 1,
                        SyncOnDelete        = 1,
                        SyncOnIncomingBatch = 0,
                        UseStreamLobs       = 0,
                        UseCaptureLobs      = 0,
                        UseCaptureOldData   = 1,
                        UseHandleKeyUpdates = 1,
                        StreamRow           = 0,
                        LastUpdateTime      = dateTimeNow,
                        CreateTime          = dateTimeNow
                    });
                }
                else
                {
                    // 修改
                    var oldTrigger = oldTriggers[trigger.Key];
                    oldTrigger.SourceTableName = trigger.Value.SourceTableName;
                    oldTrigger.ChannelId       = trigger.Value.Channel.ChannelId;
                    oldTrigger.LastUpdateTime  = dateTimeNow;
                    oldTrigger.CreateTime      = dateTimeNow;
                }
            }

            foreach (var trigger in oldTriggers)
            {
                if (!newTriggers.ContainsKey(trigger.Key))
                {
                    // 刪除
                    masterDbContext.SymTrigger.Remove(trigger.Value);
                }
            }

            bool result = false;

            try
            {
                masterDbContext.SaveChanges();
                result = true;
            }
            catch (Exception e)
            {
                LogException(nameof(Triggers), e);
            }

            return(result);
        }
        public static bool SynchronizationMethod(INode node, MasterDbContext masterDbContext, Server.ServerDbContext serverDbContext)
        {
            var oldNodeGroupLinks = masterDbContext.SymNodeGroupLink.Select(x => x).ToDictionary(x => string.Format("[{0}][{1}]", x.SourceNodeGroupId, x.TargetNodeGroupId), x => x);

            var newNodeGroupLinks     = new Dictionary <string, char>();
            var newNodeGroupLinkDatas = serverDbContext.Router.Include("SourceNodeGroup").Include("TargetNode.NodeGroup").Where(x => x.ProjectId == node.ProjectId).ToList();

            foreach (var data in newNodeGroupLinkDatas)
            {
                newNodeGroupLinks.Add(string.Format("[{0}][{1}]", data.SourceNodeGroup.NodeGroupId, data.TargetNode.NodeGroup.NodeGroupId), 'P');
                newNodeGroupLinks.Add(string.Format("[{0}][{1}]", data.TargetNode.NodeGroup.NodeGroupId, data.SourceNodeGroup.NodeGroupId), 'W');
            }

            foreach (var nodeGroupLink in newNodeGroupLinks)
            {
                if (!oldNodeGroupLinks.ContainsKey(nodeGroupLink.Key))
                {
                    var values = nodeGroupLink.Key.Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries);
                    // 新增
                    masterDbContext.SymNodeGroupLink.Add(new SymNodeGroupLink
                    {
                        SourceNodeGroupId = values[0],
                        TargetNodeGroupId = values[1],
                        DataEventAction   = nodeGroupLink.Value
                    });
                }
                else
                {
                    // 修改
                    var oldNodeGroupLink = oldNodeGroupLinks[nodeGroupLink.Key];
                    oldNodeGroupLink.DataEventAction = nodeGroupLink.Value;
                }
            }

            foreach (var nodeGroupLink in oldNodeGroupLinks)
            {
                if (!newNodeGroupLinks.ContainsKey(nodeGroupLink.Key))
                {
                    // 刪除
                    masterDbContext.SymNodeGroupLink.Remove(nodeGroupLink.Value);
                }
            }

            bool result = false;

            try
            {
                masterDbContext.SaveChanges();
                result = true;
            }
            catch (Exception e)
            {
                LogException(nameof(SynchronizationMethod), e);
            }

            return(result);
        }