コード例 #1
0
        public bool Update(
            TNew newValue,
            TDb value,
            Dictionary <int, IUpdateRecords <TUserId> > updateValues)
        {
            UpdateRecordImpl <TUserId, TDb, TKey, TNew> updateRecord;

            if (updateValues.TryGetValue(this.NodeId, out var temp))
            {
                updateRecord = (UpdateRecordImpl <TUserId, TDb, TKey, TNew>)temp;
            }
            else
            {
                updateRecord = new UpdateRecordImpl <TUserId, TDb, TKey, TNew>(
                    this.NodeId,
                    this.diffRepository);
                updateValues[this.NodeId] = updateRecord;
            }

            var changed    = false;
            var createdNew = false;

            if (value == null)
            {
                value          = new TDb();
                value.NewValue = newValue;
                createdNew     = true;
            }
            foreach (var updateValue in this.updateValues)
            {
                changed = updateValue.Update(newValue, value) || changed;
            }

            changed = (this.RunManyToOneUpdate(newValue, value, updateValues) && this.immutable) || changed;
            if (changed)
            {
                if (this.immutable || createdNew)
                {
                    updateRecord.Add(value);
                }
                else
                {
                    updateRecord.Update(value);
                }
            }

            this.RunManyToManyUpdate(newValue, value, updateValues);
            return(changed);
        }
コード例 #2
0
        public bool Update(
            TNew newValue,
            TDbValue value,
            Dictionary <int, IUpdateRecords <TUserId> > updateValues)
        {
            var newModel = this.newProp(newValue);
            var dbValue  = this.dbValue(value);

            if (newModel == null)
            {
                this.setDbValue(value, null);
                return(true);
            }

            if (dbValue == null)
            {
                dbValue = new TDbProp();
            }

            var changed = false;

            foreach (var updateValue in childValues)
            {
                changed = updateValue.Update(newModel, dbValue) || changed;
            }

            // Need to run this first.
            changed = this.RunManyToOneUpdate(
                newModel,
                dbValue,
                updateValues) || changed;
            if (changed)
            {
                UpdateRecordImpl <TUserId, TDbProp, TChildKey, TNewProp> updateNode;
                if (updateValues.TryGetValue(this.NodeId, out var node))
                {
                    updateNode = (UpdateRecordImpl <TUserId, TDbProp, TChildKey, TNewProp>)node;
                }
                else
                {
                    updateNode = new UpdateRecordImpl <TUserId, TDbProp, TChildKey, TNewProp>(this.NodeId, this.diffRepository);
                    updateValues[this.NodeId] = updateNode;
                }

                if (this.immutable)
                {
                    updateNode.Add(dbValue);
                    dbValue.NewRecord();
                }
                else
                {
                    updateNode.Update(dbValue);
                    dbValue.UpdateRecord();
                }
            }

            changed = this.RunManyToManyUpdate(
                newModel,
                dbValue,
                updateValues) || changed;
            return(changed);
        }
コード例 #3
0
        public bool Update(
            TNew newValue,
            TDbValue value,
            Dictionary <int, IUpdateRecords <TUserId> > updateValues)
        {
            var changed = false;
            UpdateRecordImpl <TUserId, TDbProp, TChildKey, TNewProp> updateNode;

            if (updateValues.TryGetValue(this.NodeId, out var temp))
            {
                updateNode = (UpdateRecordImpl <TUserId, TDbProp, TChildKey, TNewProp>)temp;
            }
            else
            {
                updateNode = new UpdateRecordImpl <TUserId, TDbProp, TChildKey, TNewProp>(
                    this.NodeId,
                    this.diffRepository);
                updateValues[this.NodeId] = updateNode;
            }

            var newValues = this.newProp(newValue);
            var dbValues  = this.dbValue(value).ToKeyValue(
                (v) => v.Id);
            var hashSetSeen = new HashSet <TChildKey>();

            foreach (var nV in newValues)
            {
                var newKey = this.newPropKey(nV);
                if (dbValues.TryGetValue(newKey, out var dbValue))
                {
                    if (!hashSetSeen.Contains(newKey))
                    {
                        hashSetSeen.Add(newKey);
                    }

                    if (this.UpdateValues(nV, dbValue) ||
                        value.IsNew())
                    {
                        if (this.immutable)
                        {
                            dbValue.NewRecord();
                            updateNode.Add(dbValue);
                        }
                        else
                        {
                            dbValue.UpdateRecord();
                            updateNode.Update(dbValue);
                        }
                    }
                }
                else
                {
                    dbValue = new TDbProp();
                    dbValue.NewRecord();
                    this.UpdateValues(nV, dbValue);
                    this.setParent(dbValue, value);
                    updateNode.Add(dbValue);
                }

                this.RunManyToOneUpdate(
                    nV,
                    dbValue,
                    updateValues);
                this.RunManyToManyUpdate(
                    nV,
                    dbValue,
                    updateValues);
            }

            var dbSet = new HashSet <TChildKey>(dbValues.Keys);

            dbSet.ExceptWith(hashSetSeen);
            foreach (var key in dbSet)
            {
                updateNode.Delete(dbValues[key]);
            }

            return(false);
        }