示例#1
0
        public static void ApplyPropertyChanges <T>(this ObjectContext context, T entity)
            where T : EntityObject
        {
            EdmEntityTypeAttribute entityTypeAttr = (EdmEntityTypeAttribute)Attribute.GetCustomAttribute(typeof(T), typeof(EdmEntityTypeAttribute), false);

            if (entityTypeAttr == null)
            {
                throw new NotSupportedException("T is not an entity.");
            }
            context.ApplyPropertyChanges(entityTypeAttr.Name, entity);
        }
示例#2
0
    public static void ApplyDetachedPropertyChanges <T>(this ObjectContext db, T entity, Func <T, int> getIdDelegate)
        where T : EntityObject
    {
        var entitySetName = db.DefaultContainerName + "." + entity.GetType().Name;
        var id            = getIdDelegate(entity);
        var entityKey     = new EntityKey(entitySetName, "Id", id);

        db.Attach(new Department {
            Id = id, EntityKey = entityKey
        });
        db.AcceptAllChanges();

        db.ApplyPropertyChanges(entitySetName, entity);
    }
示例#3
0
 public static void AttachUpdated(this ObjectContext obj, EntityObject objectDetached)
 {
     if (objectDetached.EntityState == EntityState.Detached)
     {
         object original = null;
         if (obj.TryGetObjectByKey(objectDetached.EntityKey, out original))
         {
             obj.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName, objectDetached);
         }
         else
         {
             throw new ObjectNotFoundException();
         }
     }
 }
示例#4
0
 public static void AttachUpdated(this ObjectContext context, EntityObject objectDetached)
 {
     //if (objectDetached.EntityState == EntityState.Detached)
     if (objectDetached.EntityState == EntityState.Detached || objectDetached.EntityState == EntityState.Modified)//modified by chenyh
     {
         object currentEntityInDb = null;
         if (context.TryGetObjectByKey(objectDetached.EntityKey, out currentEntityInDb))
         {
             context.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName, objectDetached);
             //Apply property changes to all referenced entities in context
             context.ApplyReferencePropertyChanges((IEntityWithRelationships)objectDetached,
                                                   (IEntityWithRelationships)currentEntityInDb);
         }
         else
         {
             throw new ObjectNotFoundException();
         }
     }
 }
示例#5
0
        public void AttachObject(EntityObject entity)
        {
            List <EntityObject> list = new List <EntityObject>();
            int maxLevel             = 2;
            int curLevel             = 0;

            AttachObjectRelation(entity, ref list, maxLevel, curLevel);

            EntityKey key = entity.EntityKey;

            if (key != null)
            {
                GetEntity(key);
                lbc.ApplyPropertyChanges(entity.GetType().Name, entity);
            }
            else
            {
                lbc.AddObject(entity.GetType().Name, entity);
            }

            //for (int i = 0;i < list.Count; i++)
            //{
            //    EntityObject curEntity = list[i];
            //    try
            //    {
            //        EntityKey key = curEntity.EntityKey;
            //        if (key != null)
            //        {
            //            GetEntity(key);
            //            lbc.ApplyPropertyChanges(curEntity.GetType().Name, entity);
            //        }
            //        else
            //        {
            //            lbc.AddObject(curEntity.GetType().Name, entity);
            //        }
            //    }
            //    catch (Exception ex)
            //    {

            //    }

            //}
        }
    public static void ApplyDetachedPropertyChanges <T>(this ObjectContext db, T entity, Func <T, int> getIdDelegate)
        where T : EntityObject
    {
        var entitySetName = db.DefaultContainerName + "." + entity.GetType().Name;

        T newEntity = Activator.CreateInstance <T>();

        newEntity.EntityKey = db.CreateEntityKey(entitySetName, entity);

        Type t = typeof(T);

        foreach (EntityKeyMember keyMember in newEntity.EntityKey.EntityKeyValues)
        {
            PropertyInfo p = t.GetProperty(keyMember.Key);
            p.SetValue(newEntity, keyMember.Value, null);
        }
        db.Attach(newEntity);
        //db.AcceptAllChanges();
        db.ApplyPropertyChanges(entitySetName, entity);
    }
示例#7
0
        /// <summary>
        /// attache entity as unchanged
        /// </summary>
        /// <typeparam name="T">entity type</typeparam>
        /// <param name="context">object context</param>
        /// <param name="entity">entity to be attached</param>
        /// <returns>attached entity</returns>
        public static T AttachExistedEntity <T>(this ObjectContext context, T entity)
            where T : EntityObject
        {
            EdmEntityTypeAttribute entityTypeAttr = (EdmEntityTypeAttribute)Attribute.GetCustomAttribute(typeof(T), typeof(EdmEntityTypeAttribute), false);

            if (entityTypeAttr == null)
            {
                throw new NotSupportedException("T is not an entity.");
            }
            string entityFullname = context.DefaultContainerName + "." + entityTypeAttr.Name;

            entity.EntityKey = new System.Data.EntityKey(entityFullname,
                                                         from p in typeof(T).GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public)
                                                         where p.GetGetMethod(false) != null
                                                         let attribute = (EdmScalarPropertyAttribute)Attribute.GetCustomAttribute(p, typeof(EdmScalarPropertyAttribute))
                                                                         where attribute != null && attribute.EntityKeyProperty
                                                                         select new KeyValuePair <string, object>(p.Name, p.GetValue(entity, null)));
            context.Attach(entity);
            context.ApplyPropertyChanges(entityTypeAttr.Name, entity);
            return(entity);
        }
示例#8
0
        public static void AttachUpdated(this ObjectContext context, EntityObject detachedEntity)
        {
            if (detachedEntity.EntityState == EntityState.Detached)
            {
                object currentEntity;

                if (context.TryGetObjectByKey(detachedEntity.EntityKey, out currentEntity))
                {
                    context.ApplyPropertyChanges(detachedEntity.EntityKey.EntitySetName, detachedEntity);

                    var newEntity = detachedEntity as IEntityWithRelationships;
                    var oldEntity = currentEntity as IEntityWithRelationships;

                    if (newEntity != null && oldEntity != null)
                    {
                        context.ApplyReferencePropertyChanges(newEntity, oldEntity);
                    }
                }
                else
                {
                    throw new ObjectNotFoundException();
                }
            }
        }
        /// <summary>
        /// Apply changes from the newEntity to the original entity
        /// </summary>
        /// <param name="objectContext">ObjectContext instance.</param>
        /// <param name="originalTrackedEntity">original entity which is tracked by the context.</param>
        /// <param name="newEntity">newEntity which contains all the changed values.</param>
        private static void ApplyChangesToEntity(ObjectContext objectContext, object originalTrackedEntity, object newEntity)
        {
            ObjectStateEntry objectStateEntry = objectContext.ObjectStateManager.GetObjectStateEntry(originalTrackedEntity);
            string entitySetName = ObjectContextServiceProvider.GetEntitySetName(objectStateEntry, objectContext.DefaultContainerName);
            if (objectStateEntry.State == EntityState.Added)
            {
                // In the case of batching if we do a PUT after POST in the same changeset, we need to detach and re-add.
                objectContext.Detach(originalTrackedEntity);
                objectContext.AddObject(entitySetName, newEntity);
            }
            else
            {
#pragma warning disable 618
                // Since we use to do this in V1, keeping the same code there.
                // Apply property changes as specified in the new object.
                objectContext.ApplyPropertyChanges(entitySetName, newEntity);
#pragma warning restore 618
            }
        }