public int Edit(Entity entity) { if (entity.Key.Value == null) { Error(IlaroAdminResources.EntityKeyIsNull); return(0); } var existingItem = GetEntity(entity, entity.Key.Value); if (existingItem == null) { Error(IlaroAdminResources.EntityNotExist); return(0); } var table = new DynamicModel(AdminInitialise.ConnectionString, tableName: entity.TableName, primaryKeyField: entity.Key.ColumnName); var expando = new ExpandoObject(); var filler = expando as IDictionary <String, object>; foreach (var property in entity.CreateProperties(getForeignCollection: false)) { filler[property.ColumnName] = property.Value; } var cmd = table.CreateUpdateCommand(expando, entity.Key.Value); foreach (var property in entity.Properties.Where(x => x.IsForeignKey && x.IsCollection)) { var actualRecords = GetRecords(property.ForeignEntity, new List <IEntityFilter> { new ForeignEntityFilter(entity.Key, entity.Key.Value.ToStringSafe()) }); var idsToRemoveRelation = actualRecords.Select(x => x.KeyValue); idsToRemoveRelation = idsToRemoveRelation.Except(property.Values.OfType <string>()); // UPDATE {TableName} SET {ForeignKey} = {FKValue} WHERE {PrimaryKey} In ({PKValues}); var updateFormat = Environment.NewLine + ";UPDATE {0} SET {1} = {2} WHERE {3} In ({4})"; if (idsToRemoveRelation.Any()) { cmd.CommandText += Environment.NewLine + string.Format(updateFormat, property.ForeignEntity.TableName, entity.Key.ColumnName, "NULL", property.ForeignEntity.Key.ColumnName, DecorateSqlValue(idsToRemoveRelation.OfType <object>().ToList(), property.ForeignEntity.Key)); } cmd.CommandText += Environment.NewLine + string.Format(updateFormat, property.ForeignEntity.TableName, entity.Key.ColumnName, DecorateSqlValue(entity.Key.Value, entity.Key), property.ForeignEntity.Key.ColumnName, DecorateSqlValue(property.Values, property.ForeignEntity.Key)); } var savedItems = table.Execute(cmd); // TODO: get info about changed properties AddEntityChange(entity.Name, entity.Key.StringValue, EntityChangeType.Update); ClearProperties(entity); return(savedItems); }