Ejemplo n.º 1
0
        public void Evict(DataAccessObject value)
        {
            if (this.dataAccessObjectDataContext.isCommiting)
            {
                return;
            }

            if (value.GetAdvanced().IsNew)
            {
                if (value.GetAdvanced().PrimaryKeyIsCommitReady)
                {
                    this.newObjects.Remove(value);
                }
                else
                {
                    this.objectsNotReadyForCommit?.Remove(value);
                }

                return;
            }

            var internalDao = value.ToObjectInternal();
            var predicate   = internalDao?.DeflatedPredicate;

            if (predicate != null)
            {
                this.objectsByPredicateCache?.Remove(predicate);

                return;
            }

            if (value.GetAdvanced().IsMissingAnyDirectOrIndirectServerSideGeneratedPrimaryKeys)
            {
                return;
            }

            var id = this.getIdFunc(value);

            this.objectsDeleted?.Remove(id);
            this.objectsByIdCache.Remove(id);
        }
            public DataAccessObject Cache(DataAccessObject value, bool forImport)
            {
                if (this.dataAccessObjectDataContext.isCommiting)
                {
                    return(value);
                }

                if (value.GetAdvanced().IsNew)
                {
                    if (value.GetAdvanced().PrimaryKeyIsCommitReady)
                    {
                        DataAccessObject result;

                        if (this.newObjects.TryGetValue(value, out result))
                        {
                            if (result != value)
                            {
                                throw new ObjectAlreadyExistsException(value, null, null);
                            }
                        }

                        this.newObjects[value] = value;

                        this.objectsNotReadyForCommit.Remove(value);

                        if (value.GetAdvanced().NumberOfPrimaryKeysGeneratedOnServerSide > 0)
                        {
                            return(value);
                        }
                    }
                    else
                    {
                        if (!this.objectsNotReadyForCommit.Contains(value))
                        {
                            this.objectsNotReadyForCommit.Add(value);
                        }

                        return(value);
                    }
                }

                var internalDao = value.ToObjectInternal();
                var predicate   = internalDao?.DeflatedPredicate;

                if (predicate != null)
                {
                    if (forImport)
                    {
                        throw new InvalidOperationException("Cannot import predicated deflated object");
                    }

                    DataAccessObject existing;

                    if (this.objectsByPredicateCache.TryGetValue(predicate, out existing))
                    {
                        existing.ToObjectInternal().SwapData(value, true);

                        return(existing);
                    }

                    this.objectsByPredicateCache[predicate] = value;

                    return(value);
                }

                if (value.GetAdvanced().IsMissingAnyDirectOrIndirectServerSideGeneratedPrimaryKeys)
                {
                    return(value);
                }

                var id = this.getIdFunc(value);

                if (!forImport)
                {
                    DataAccessObject outValue;

                    if (this.objectsByIdCache.TryGetValue(id, out outValue))
                    {
                        var deleted = outValue.IsDeleted();

                        outValue.ToObjectInternal().SwapData(value, true);

                        if (deleted)
                        {
                            outValue.ToObjectInternal().SetIsDeleted(true);
                        }

                        return(outValue);
                    }
                }

                if (this.objectsDeleted != null)
                {
                    DataAccessObject existingDeleted;

                    if (this.objectsDeleted.TryGetValue(id, out existingDeleted))
                    {
                        if (!forImport)
                        {
                            existingDeleted.ToObjectInternal().SwapData(value, true);
                            existingDeleted.ToObjectInternal().SetIsDeleted(true);

                            return(existingDeleted);
                        }
                        else
                        {
                            if (value.IsDeleted())
                            {
                                this.objectsDeleted[id] = value;
                            }
                            else
                            {
                                this.objectsDeleted.Remove(id);
                                this.objectsByIdCache[id] = value;
                            }

                            return(value);
                        }
                    }
                }

                this.objectsByIdCache[id] = value;

                return(value);
            }
Ejemplo n.º 3
0
        public DataAccessObject Cache(DataAccessObject value, bool forImport)
        {
            if (this.dataAccessObjectDataContext.isCommiting)
            {
                return(value);
            }

            if (value.GetAdvanced().IsNew)
            {
                if (value.GetAdvanced().PrimaryKeyIsCommitReady)
                {
                    if (this.newObjects.TryGetValue(value, out var result))
                    {
                        if (result != value)
                        {
                            throw new ObjectAlreadyExistsException(value, null, null);
                        }
                    }

                    this.newObjects[value] = value;

                    this.objectsNotReadyForCommit?.Remove(value);

                    if (value.GetAdvanced().NumberOfPrimaryKeysGeneratedOnServerSide > 0)
                    {
                        return(value);
                    }
                }
                else
                {
                    if (!(this.objectsNotReadyForCommit?.Contains(value) ?? false))
                    {
                        (this.objectsNotReadyForCommit = this.objectsNotReadyForCommit ?? new HashSet <DataAccessObject>(ObjectReferenceIdentityEqualityComparer <IDataAccessObjectAdvanced> .Default))
                        .Add(value);
                    }

                    return(value);
                }
            }

            var internalDao = value.ToObjectInternal();
            var predicate   = internalDao?.DeflatedPredicate;

            if (predicate != null)
            {
                if (forImport)
                {
                    throw new InvalidOperationException("Cannot import predicated deflated object");
                }

                if (this.objectsByPredicateCache != null)
                {
                    if (this.objectsByPredicateCache.TryGetValue(predicate, out var existing))
                    {
                        existing.ToObjectInternal().SwapData(value, true);

                        return(existing);
                    }
                }

                (this.objectsByPredicateCache = this.objectsByPredicateCache ?? new Dictionary <LambdaExpression, DataAccessObject>())[predicate] = value;

                return(value);
            }

            if (value.GetAdvanced().IsMissingAnyDirectOrIndirectServerSideGeneratedPrimaryKeys)
            {
                return(value);
            }

            var id = this.getIdFunc(value);

            if (!forImport)
            {
                if (this.objectsByIdCache.TryGetValue(id, out var outValue))
                {
                    var deleted = outValue.IsDeleted();

                    outValue.ToObjectInternal().SwapData(value, true);

                    if (deleted)
                    {
                        outValue.ToObjectInternal().SetIsDeleted(true);
                    }

                    return(outValue);
                }
            }

            if (this.objectsDeleted != null)
            {
                if (this.objectsDeleted.TryGetValue(id, out var existingDeleted))
                {
                    if (!forImport)
                    {
                        existingDeleted.ToObjectInternal().SwapData(value, true);
                        existingDeleted.ToObjectInternal().SetIsDeleted(true);

                        return(existingDeleted);
                    }
                    else
                    {
                        if (value.IsDeleted())
                        {
                            this.objectsDeleted[id] = value;
                        }
                        else
                        {
                            this.objectsDeleted.Remove(id);
                            this.objectsByIdCache[id] = value;
                        }

                        return(value);
                    }
                }
            }

            this.objectsByIdCache[id] = value;

            return(value);
        }