Exemple #1
0
            private StandardTrackedObject PromoteFastTrackedObject(MetaType type, object obj)
            {
                var standardTrackedObject = new StandardTrackedObject(this, type, obj, obj);

                items.Add(obj, standardTrackedObject);
                return(standardTrackedObject);
            }
Exemple #2
0
            private StandardTrackedObject PromoteFastTrackedObject(MetaType type, object obj)
            {
                StandardTrackedObject ti = new StandardTrackedObject(this, type, obj, obj);

                this.items.Add(obj, ti);
                return(ti);
            }
Exemple #3
0
            private TrackedObject Track(MetaType mt, object obj, Dictionary <object, object> visited, bool recurse, int level)
            {
                var standardTrackedObject = (StandardTrackedObject)GetTrackedObject(obj);

                if (standardTrackedObject != null || visited.ContainsKey(obj))
                {
                    return(standardTrackedObject);
                }
                var isWeaklyTracked = level > 1;

                standardTrackedObject = new StandardTrackedObject(this, mt, obj, obj, isWeaklyTracked);
                if (standardTrackedObject.HasDeferredLoaders)
                {
                    throw System.Data.Linq.Error.CannotAttachAddNonNewEntities();
                }
                items.Add(obj, standardTrackedObject);
                Attach(obj);
                visited.Add(obj, obj);
                if (recurse)
                {
                    foreach (var parent in services.GetParents(mt, obj))
                    {
                        Track(parent.Type, parent.Item, visited, recurse, level + 1);
                    }
                    {
                        foreach (var child in services.GetChildren(mt, obj))
                        {
                            Track(child.Type, child.Item, visited, recurse, level + 1);
                        }
                        return(standardTrackedObject);
                    }
                }
                return(standardTrackedObject);
            }
Exemple #4
0
            private TrackedObject Track(MetaType mt, object obj, IDictionary <object, object> visited, bool recurse,
                                        int level)
            {
                var trackedObject = (StandardTrackedObject)GetTrackedObject(obj);

                if ((trackedObject == null) && !visited.ContainsKey(obj))
                {
                    bool isWeaklyTracked = level > 1;
                    trackedObject = new StandardTrackedObject(this, mt, obj, obj, isWeaklyTracked);
                    if (trackedObject.HasDeferredLoaders)
                    {
                        throw Error.CannotAttachAddNonNewEntities();
                    }
                    items.Add(obj, trackedObject);
                    Attach(obj);
                    visited.Add(obj, obj);
                    if (!recurse)
                    {
                        return(trackedObject);
                    }
                    foreach (RelatedItem item in services.GetParents(mt, obj))
                    {
                        Track(item.Type, item.Item, visited, recurse, level + 1);
                    }
                    foreach (RelatedItem item2 in services.GetChildren(mt, obj))
                    {
                        Track(item2.Type, item2.Item, visited, recurse, level + 1);
                    }
                }

                return(trackedObject);
            }
Exemple #5
0
 internal override bool IsMemberPendingGeneration(MetaDataMember keyMember)
 {
     if (this.IsNew && keyMember.IsDbGenerated)
     {
         return(true);
     }
     // look for any FK association that has this key member (should only be one)
     foreach (MetaAssociation assoc in type.Associations)
     {
         if (assoc.IsForeignKey)
         {
             int index = assoc.ThisKey.IndexOf(keyMember);
             if (index > -1)
             {
                 // we must have a reference to this other object to know if its side of
                 // the association is generated or not
                 object otherItem = null;
                 if (assoc.ThisMember.IsDeferred)
                 {
                     otherItem = assoc.ThisMember.DeferredValueAccessor.GetBoxedValue(this.current);
                 }
                 else
                 {
                     otherItem = assoc.ThisMember.StorageAccessor.GetBoxedValue(this.current);
                 }
                 if (otherItem != null)
                 {
                     if (assoc.IsMany)
                     {
                         // Can't be pending generation for a value that would have to be the same
                         // across many rows.
                         continue;
                     }
                     else
                     {
                         StandardTrackedObject trackedOther = (StandardTrackedObject)this.tracker.GetTrackedObject(otherItem);
                         if (trackedOther != null)
                         {
                             MetaDataMember otherMember = assoc.OtherKey[index];
                             return(trackedOther.IsMemberPendingGeneration(otherMember));
                         }
                     }
                 }
             }
         }
     }
     return(false);
 }
Exemple #6
0
            private TrackedObject Track(MetaType mt, object obj, Dictionary <object, object> visited, bool recurse, int level)
            {
                StandardTrackedObject tracked = (StandardTrackedObject)this.GetTrackedObject(obj);

                if (tracked != null || visited.ContainsKey(obj))
                {
                    return(tracked);
                }

                // The root object tracked is tracked normally - all other objects
                // in the reference graph are weakly tracked.
                bool weaklyTrack = level > 1;

                tracked = new StandardTrackedObject(this, mt, obj, obj, weaklyTrack);
                if (tracked.HasDeferredLoaders)
                {
                    throw Error.CannotAttachAddNonNewEntities();
                }
                this.items.Add(obj, tracked);
                this.Attach(obj);
                visited.Add(obj, obj);

                if (recurse)
                {
                    // track parents (objects we are dependent on)
                    foreach (RelatedItem parent in this.services.GetParents(mt, obj))
                    {
                        this.Track(parent.Type, parent.Item, visited, recurse, level + 1);
                    }

                    // track children (objects that are dependent on us)
                    foreach (RelatedItem child in this.services.GetChildren(mt, obj))
                    {
                        this.Track(child.Type, child.Item, visited, recurse, level + 1);
                    }
                }

                return(tracked);
            }
		private TrackedObject Track(MetaType mt, object obj, Dictionary<object, object> visited, bool recurse, int level)
		{
			StandardTrackedObject tracked = (StandardTrackedObject)this.GetTrackedObject(obj);
			if(tracked != null || visited.ContainsKey(obj))
			{
				return tracked;
			}

			// The root object tracked is tracked normally - all other objects
			// in the reference graph are weakly tracked.
			bool weaklyTrack = level > 1;
			tracked = new StandardTrackedObject(this, mt, obj, obj, weaklyTrack);
			if(tracked.HasDeferredLoaders)
			{
				throw Error.CannotAttachAddNonNewEntities();
			}
			this.items.Add(obj, tracked);
			this.Attach(obj);
			visited.Add(obj, obj);

			if(recurse)
			{
				// track parents (objects we are dependent on)
				foreach(RelatedItem parent in this.services.GetParents(mt, obj))
				{
					this.Track(parent.Type, parent.Item, visited, recurse, level + 1);
				}

				// track children (objects that are dependent on us)
				foreach(RelatedItem child in this.services.GetChildren(mt, obj))
				{
					this.Track(child.Type, child.Item, visited, recurse, level + 1);
				}
			}

			return tracked;
		}
 private StandardTrackedObject PromoteFastTrackedObject(MetaType type, object obj) {
     StandardTrackedObject ti = new StandardTrackedObject(this, type, obj, obj);
     this.items.Add(obj, ti);
     return ti;
 }