private static object CreateFullUpdateInstance(DataModificationItem entry, Type entityType) { // The algorithm for a "FullReplaceUpdate" is taken from ObjectContextServiceProvider.ResetResource // in WCF DS, and works as follows: // - Create a new, blank instance of the entity. // - Copy over the key values and set any updated values from the client on the new instance. // - Then apply all the properties of the new instance to the instance to be updated. // This will set any unspecified properties to their default value. object newInstance = Activator.CreateInstance(entityType); ChangeSetInitializer.SetValues(newInstance, entityType, entry.EntityKey); ChangeSetInitializer.SetValues(newInstance, entityType, entry.LocalValues); return(newInstance); }
private static async Task PrepareEntry <TEntity>( SubmitContext context, DbContext dbContext, DataModificationItem entry, DbSet <TEntity> set, CancellationToken cancellationToken) where TEntity : class { Type entityType = typeof(TEntity); TEntity entity; if (entry.DataModificationItemAction == DataModificationItemAction.Insert) { // TODO: See if Create method is in DbSet<> in future EF7 releases, as the one EF6 has. entity = (TEntity)Activator.CreateInstance(typeof(TEntity)); ChangeSetInitializer.SetValues(entity, entityType, entry.LocalValues); set.Add(entity); } else if (entry.DataModificationItemAction == DataModificationItemAction.Remove) { entity = (TEntity)await ChangeSetInitializer.FindEntity(context, entry, cancellationToken); set.Remove(entity); } else if (entry.DataModificationItemAction == DataModificationItemAction.Update) { if (entry.IsFullReplaceUpdateRequest) { entity = (TEntity)ChangeSetInitializer.CreateFullUpdateInstance(entry, entityType); dbContext.Update(entity); } else { entity = (TEntity)await ChangeSetInitializer.FindEntity(context, entry, cancellationToken); var dbEntry = dbContext.Attach(entity); ChangeSetInitializer.SetValues(dbEntry, entry); } } else { throw new NotSupportedException(Resources.DataModificationMustBeCUD); } entry.Entity = entity; }