Пример #1
0
        protected InsertExpression CreateInsertExpression(object entity, TableAttribute table, IColumnInfoCollection columns)
        {
            var values = new ValuesExpression();
            var insert = new InsertExpression(new TableExpression(table))
            {
                Values = values
            };
            var type = entity.GetType();

            if (type.Module.ScopeName == "FooBar")
            {
                type = type.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();
                }
            }
            return(insert);
        }
Пример #2
0
        public override void CommitChanges(IEnumerable entities, TableAttribute table, IColumnInfoCollection columns)
        {
            using (_connection = OpenConnection())
            {
                lock (_connection)
                {
                    using (_transaction = _connection.BeginTransaction())
                    {
                        try
                        {
                            foreach (IEntityProxy entity in entities)
                            {
                                switch (entity.State)
                                {
                                case EntityState.Added:
                                    Insert(entity, table, columns);
                                    var pk = columns.SingleOrDefault(c => c.IsIdentity);
                                    if (pk != null)
                                    {
                                        var idCommand = string.Format("SELECT CAST(@@IDENTITY AS {0})", pk.ColumnType);
                                        pk.SetValue(entity, ExecuteScalar(idCommand));
                                    }
                                    entity.ClearDirty();
                                    entity.State = EntityState.Unchanged;
                                    break;

                                case EntityState.Changed:
                                    Update(entity, table, columns);
                                    entity.ClearDirty();
                                    entity.State = EntityState.Unchanged;
                                    break;

                                case EntityState.Deleted:
                                    Delete(entity, table, columns);
                                    break;
                                }
                            }
                            _transaction.Commit();
                        }
                        catch (Exception)
                        {
                            _transaction.Rollback();
                            throw;
                        }
                    }
                    _transaction = null;
                }
            }
        }