/// <summary> /// Extension method used to attach the specified entity as modified, /// with the specified original state. /// </summary> /// <typeparam name="TEntity">The entity Type</typeparam> /// <param name="dbSet">The <see cref="DbSet"/> to attach to.</param> /// <param name="current">The current entity.</param> /// <param name="original">The original entity.</param> /// <param name="dbContext">The corresponding <see cref="DbContext"/></param> public static void AttachAsModified <TEntity>(this DbSet <TEntity> dbSet, TEntity current, TEntity original, DbContext dbContext) where TEntity : class { if (dbSet == null) { throw Error.ArgumentNull("dbSet"); } if (current == null) { throw Error.ArgumentNull("current"); } if (original == null) { throw Error.ArgumentNull("original"); } if (dbContext == null) { throw Error.ArgumentNull("dbContext"); } DbEntityEntry <TEntity> entityEntry = dbContext.Entry(current); if (entityEntry.State == EntityState.Detached) { dbSet.Attach(current); } else { entityEntry.State = EntityState.Modified; } ObjectContext objectContext = (dbContext as IObjectContextAdapter).ObjectContext; ObjectStateEntry stateEntry = ObjectContextUtilities.AttachAsModifiedInternal <TEntity>(current, original, objectContext); if (stateEntry.State != EntityState.Modified) { // Ensure that when we leave this method, the entity is in a // Modified state. For example, if current and original are the // same, we still need to force the state transition entityEntry.State = EntityState.Modified; } }
/// <summary> /// Extension method used to attach the specified entity as modified, /// with the specified original state. /// </summary> /// <typeparam name="TEntity">The entity Type</typeparam> /// <param name="objectSet">The ObjectSet to attach to</param> /// <param name="current">The current entity state</param> /// <param name="original">The original entity state</param> public static void AttachAsModified <TEntity>(this ObjectSet <TEntity> objectSet, TEntity current, TEntity original) where TEntity : class { if (objectSet == null) { throw Error.ArgumentNull("objectSet"); } if (current == null) { throw Error.ArgumentNull("current"); } if (original == null) { throw Error.ArgumentNull("original"); } // Attach the entity if it is not already attached, or if it is already // attached, transition to Modified EntityState currState = ObjectContextUtilities.GetEntityState(objectSet.Context, current); if (currState == EntityState.Detached) { objectSet.Attach(current); } else { objectSet.Context.ObjectStateManager.ChangeObjectState(current, EntityState.Modified); } ObjectStateEntry stateEntry = ObjectContextUtilities.AttachAsModifiedInternal <TEntity>(current, original, objectSet.Context); if (stateEntry.State != EntityState.Modified) { // Ensure that when we leave this method, the entity is in a // Modified state. For example, if current and original are the // same, we still need to force the state transition objectSet.Context.ObjectStateManager.ChangeObjectState(current, EntityState.Modified); } }
/// <summary> /// Extension method used to attach the specified entity as modified. This overload /// can be used in cases where the entity has a Timestamp member. /// </summary> /// <typeparam name="TEntity">The entity Type</typeparam> /// <param name="objectSet">The ObjectSet to attach to</param> /// <param name="entity">The current entity state</param> public static void AttachAsModified <TEntity>(this ObjectSet <TEntity> objectSet, TEntity entity) where TEntity : class { if (objectSet == null) { throw Error.ArgumentNull("objectSet"); } if (entity == null) { throw Error.ArgumentNull("entity"); } ObjectContext context = objectSet.Context; EntityState currState = ObjectContextUtilities.GetEntityState(context, entity); if (currState == EntityState.Detached) { // attach the entity objectSet.Attach(entity); } // transition the entity to the modified state context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified); }