/// <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(); } } }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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(); }