protected virtual void Insert(IEntityProxy entity, TableAttribute table, ColumnInfoCollection columns) { var values = new ValuesExpression(); var insert = new InsertExpression(new TableExpression(table)) { Values = values }; var type = entity.GetType().BaseType; var discriminator = columns.SingleOrDefault(c => c.IsDiscriminatorColumn); if (discriminator != null) { values.AddColumn(discriminator.ToColumnExpression()); values.AddValue(Expression.Constant(type.FullName)); } foreach (var pi in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { try { var column = columns.SingleOrDefault(c => c.DescribesProperty(pi)); if (column == null) { continue; } var value = pi.GetValue(entity); if (column.IsIdentity) { var defaultValue = Activator.CreateInstance(pi.PropertyType); if (!value.Equals(defaultValue)) { insert.IsIdentityInsertEnabled = true; } else { continue; } } values.AddColumn(column.ToColumnExpression()); values.AddValue(Expression.Constant(value)); } catch (Exception ex) { Debugger.Break(); } } ExecuteNonQuery(insert); }
protected virtual void Update(IEntityProxy entity, TableAttribute table, IEnumerable <ColumnInfo> columns) { //TODO: do not let an identity field to be dirtied var update = new UpdateExpression(new TableExpression(table)); foreach (var column in columns.Where(c => c.IsIdentity)) { update.AddWhere(column.ToEqualExpression(entity)); } var type = entity.GetType(); foreach (var property in entity.DirtyProperties) { var pi = type.GetProperty(property); var column = columns.First(c => c.DescribesProperty(pi)); update.AddSet(new SetExpression(column.ToColumnExpression(), Expression.Constant(pi.GetValue(entity)))); } ExecuteNonQuery(update); }