예제 #1
0
        /// <summary>Updates references.</summary>
        /// <param name="obj">Object.</param>
        public void UpdateReferences(object obj)
        {
            if (!IsExternal)
            {
                return;
            }
            if (GetValue(obj) == null)
            {
                return;
            }

            Type     innerType   = Type.GetGenericArguments()[0];
            __Entity innerEntity = innerType._GetEntity();
            object   pk          = Entity.PrimaryKey.ToColumnType(Entity.PrimaryKey.GetValue(obj));

            if (IsManyToMany)
            {
                IDbCommand cmd = Orm.Connection.CreateCommand();
                cmd.CommandText = ("DELETE FROM " + AssignmentTable + " WHERE " + ColumnName + " = :pk");
                IDataParameter p = cmd.CreateParameter();
                p.ParameterName = ":pk";
                p.Value         = pk;
                cmd.Parameters.Add(p);

                cmd.ExecuteNonQuery();
                cmd.Dispose();

                foreach (object i in (IEnumerable)GetValue(obj))
                {
                    cmd             = Orm.Connection.CreateCommand();
                    cmd.CommandText = ("INSERT INTO " + AssignmentTable + "(" + ColumnName + ", " + RemoteColumnName + ") VALUES (:pk, :fk)");
                    p = cmd.CreateParameter();
                    p.ParameterName = ":pk";
                    p.Value         = pk;
                    cmd.Parameters.Add(p);

                    p = cmd.CreateParameter();
                    p.ParameterName = ":fk";
                    p.Value         = innerEntity.PrimaryKey.ToColumnType(innerEntity.PrimaryKey.GetValue(i));
                    cmd.Parameters.Add(p);

                    cmd.ExecuteNonQuery();
                    cmd.Dispose();
                }
            }
            else
            {
                __Field remoteField = innerEntity.GetFieldForColumn(ColumnName);

                if (remoteField.IsNullable)
                {
                    try
                    {
                        IDbCommand cmd = Orm.Connection.CreateCommand();
                        cmd.CommandText = ("UPDATE " + innerEntity.TableName + " SET " + ColumnName + " = NULL WHERE " + ColumnName + " = :fk");
                        IDataParameter p = cmd.CreateParameter();
                        p.ParameterName = ":fk";
                        p.Value         = pk;
                        cmd.Parameters.Add(p);

                        cmd.ExecuteNonQuery();
                        cmd.Dispose();
                    }
                    catch (Exception) {}
                }

                foreach (object i in (IEnumerable)GetValue(obj))
                {
                    remoteField.SetValue(i, obj);

                    IDbCommand cmd = Orm.Connection.CreateCommand();
                    cmd.CommandText = ("UPDATE " + innerEntity.TableName + " SET " + ColumnName + " = :fk WHERE " + innerEntity.PrimaryKey.ColumnName + " = :pk");
                    IDataParameter p = cmd.CreateParameter();
                    p.ParameterName = ":fk";
                    p.Value         = pk;
                    cmd.Parameters.Add(p);

                    p = cmd.CreateParameter();
                    p.ParameterName = ":pk";
                    p.Value         = innerEntity.PrimaryKey.ToColumnType(innerEntity.PrimaryKey.GetValue(i));
                    cmd.Parameters.Add(p);

                    cmd.ExecuteNonQuery();
                    cmd.Dispose();
                }
            }
        }
예제 #2
0
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // constructors                                                                                                     //
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>Creates a new instance of this class.</summary>
        /// <param name="t">Type.</param>
        public __Entity(Type t)
        {
            EntityAttribute tattr = (EntityAttribute)t.GetCustomAttribute(typeof(EntityAttribute));

            if (tattr == null)
            {
                MaterialAttribute mattr = (MaterialAttribute)t.GetCustomAttribute(typeof(MaterialAttribute));
                if (mattr != null)
                {
                    TableName   = mattr.TableName;
                    SubsetQuery = mattr.SubsetQuery;
                    IsMaterial  = true;
                }
            }
            else
            {
                TableName   = tattr.TableName;
                SubsetQuery = tattr.SubsetQuery;
                ChildKey    = tattr.ChildKey;
            }

            if (string.IsNullOrWhiteSpace(TableName))
            {
                TableName = t.Name.ToUpper();
            }

            Member = t;
            List <__Field> fields = new List <__Field>();

            foreach (PropertyInfo i in t.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
            {
                if ((IgnoreAttribute)i.GetCustomAttribute(typeof(IgnoreAttribute)) != null)
                {
                    continue;
                }

                __Field field = new __Field(this);

                FieldAttribute fattr = (FieldAttribute)i.GetCustomAttribute(typeof(FieldAttribute));

                if (fattr != null)
                {
                    if (fattr is PrimaryKeyAttribute)
                    {
                        PrimaryKey         = field;
                        field.IsPrimaryKey = true;
                    }

                    field.ColumnName = (fattr?.ColumnName ?? i.Name);
                    field.ColumnType = (fattr?.ColumnType ?? i.PropertyType);

                    field.IsNullable = fattr.Nullable;

                    if (field.IsForeignKey = (fattr is ForeignKeyAttribute))
                    {
                        field.IsExternal = typeof(IEnumerable).IsAssignableFrom(i.PropertyType);

                        field.AssignmentTable  = ((ForeignKeyAttribute)fattr).AssignmentTable;
                        field.RemoteColumnName = ((ForeignKeyAttribute)fattr).RemoteColumnName;
                        field.IsManyToMany     = (!string.IsNullOrWhiteSpace(field.AssignmentTable));
                    }
                }
                else
                {
                    if ((i.GetGetMethod() == null) || (!i.GetGetMethod().IsPublic))
                    {
                        continue;
                    }

                    field.ColumnName = i.Name;
                    field.ColumnType = i.PropertyType;
                }
                field.Member = i;

                fields.Add(field);
            }

            Fields    = fields.ToArray();
            Internals = fields.Where(m => (!m.IsExternal)).ToArray();
            Externals = fields.Where(m => m.IsExternal).ToArray();
        }