예제 #1
0
        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);
        }
예제 #2
0
        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);
        }