/// <summary>Creates an object from a database reader.</summary> /// <typeparam name="T">Type.</typeparam> /// <param name="re">Reader.</param> /// <param name="localCache">Local cache.</param> /// <returns>Object.</returns> internal static object _CreateObject(Type t, IDataReader re, ICollection <object> localCache) { __Entity ent = t._GetEntity(); object rval = _SearchCache(t, ent.PrimaryKey.ToFieldType(re.GetValue(re.GetOrdinal(ent.PrimaryKey.ColumnName)), localCache), localCache); if (rval == null) { if (localCache == null) { localCache = new List <object>(); } localCache.Add(rval = Activator.CreateInstance(t)); } foreach (__Field i in ent.Internals) { i.SetValue(rval, i.ToFieldType(re.GetValue(re.GetOrdinal(i.ColumnName)), localCache)); } foreach (__Field i in ent.Externals) { if (typeof(ILazy).IsAssignableFrom(i.Type)) { i.SetValue(rval, Activator.CreateInstance(i.Type, rval, i.Member.Name)); } else { i.SetValue(rval, i.Fill(Activator.CreateInstance(i.Type), rval, localCache)); } } return(rval); }
/// <summary>Saves an object.</summary> /// <param name="obj">Object.</param> public static void Save(object obj) { __Entity ent = obj._GetEntity(); __Entity bse = obj.GetType().BaseType._GetEntity(); if (bse.IsMaterial) { _Save(obj, bse, false, true); } _Save(obj, ent, bse.IsMaterial, false); }
/// <summary>Deletes an object.</summary> /// <param name="obj">Object.</param> public static void Delete(object obj) { __Entity ent = obj._GetEntity(); __Entity bse = obj.GetType().BaseType._GetEntity(); if (bse.IsMaterial) { _Delete(obj, ent, false); _Delete(obj, bse, true); } else { _Delete(obj, ent, true); } }
/// <summary>Deletes an object.</summary> /// <param name="obj">Object.</param> /// <param name="ent">Entity.</param> /// <param name="isBase">Determines if the entity is a base table.</param> private static void _Delete(object obj, __Entity ent, bool isBase) { IDbCommand cmd = Connection.CreateCommand(); cmd.CommandText = ("DELETE FROM " + ent.TableName + " WHERE " + (isBase ? ent.PrimaryKey.ColumnName : ent.ChildKey) + " = :pk"); IDataParameter p = cmd.CreateParameter(); p.ParameterName = ":pk"; p.Value = ent.PrimaryKey.GetValue(obj); cmd.Parameters.Add(p); cmd.ExecuteNonQuery(); cmd.Dispose(); if (Cache != null) { Cache.Remove(obj); } }
/// <summary>Creates an instance by its primary keys.</summary> /// <param name="t">Type.</param> /// <param name="pk">Primary key.</param> /// <param name="localCache">Local cache.</param> /// <returns>Object.</returns> internal static object _CreateObject(Type t, object pk, ICollection <object> localCache) { object rval = null; int locc = ((localCache != null) ? localCache.Count : 0); IDbCommand cmd = Connection.CreateCommand(); __Entity ent = t._GetEntity(); cmd.CommandText = ent.GetSQL() + (string.IsNullOrWhiteSpace(ent.SubsetQuery) ? " WHERE " : " AND ") + t._GetEntity().PrimaryKey.ColumnName + " = :pk"; IDataParameter p = cmd.CreateParameter(); p.ParameterName = (":pk"); p.Value = pk; cmd.Parameters.Add(p); IDataReader re = cmd.ExecuteReader(); if (re.Read()) { rval = _CreateObject(t, re, localCache); } re.Close(); cmd.Dispose(); if (Cache != null) { if ((localCache != null) && (localCache.Count > locc)) { Cache.Put(rval); } } return(rval); }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // private methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary>Gets class and object key for an object.</summary> /// <param name="obj">Object.</param> /// <returns>Returns a tuple containing class and object key.</returns> private (string ClassKey, string ObjectKey) _GetKeys(object obj) { __Entity ent = obj._GetEntity(); return(ent.TableName, ent.PrimaryKey.ToColumnType(ent.PrimaryKey.GetValue(obj)).ToString()); }
/// <summary>Saves an object.</summary> /// <param name="obj">Object.</param> /// <param name="ent">Entity.</param> /// <param name="hasMaterialBase">Determines if the base class table is material.</param> /// <param name="isBase">Determines if the the object is the base class table.</param> private static void _Save(object obj, __Entity ent, bool hasMaterialBase, bool isBase) { if (Cache != null) { if (!Cache.HasChanged(obj)) { return; } } IDbCommand cmd = Connection.CreateCommand(); string update = ""; string insert = ""; cmd.CommandText = ("INSERT INTO " + ent.TableName + " ("); if (hasMaterialBase) { cmd.CommandText += ent.ChildKey + ", "; update = "ON CONFLICT (" + ent.ChildKey + ") DO UPDATE SET "; insert = (":ck, "); IDataParameter k = cmd.CreateParameter(); k.ParameterName = ":ck"; k.Value = ent.PrimaryKey.GetValue(obj); cmd.Parameters.Add(k); } else { update = "ON CONFLICT (" + ent.PrimaryKey.ColumnName + ") DO UPDATE SET "; } IDataParameter p; bool first = true; for (int i = 0; i < ent.LocalInternals.Length; i++) { if (i > 0) { cmd.CommandText += ", "; insert += ", "; } cmd.CommandText += ent.LocalInternals[i].ColumnName; insert += (":v" + i.ToString()); p = cmd.CreateParameter(); p.ParameterName = (":v" + i.ToString()); p.Value = ent.LocalInternals[i].ToColumnType(ent.LocalInternals[i].GetValue(obj)); cmd.Parameters.Add(p); if (!ent.LocalInternals[i].IsPrimaryKey) { if (first) { first = false; } else { update += ", "; } update += (ent.LocalInternals[i].ColumnName + " = " + (":w" + i.ToString())); p = cmd.CreateParameter(); p.ParameterName = (":w" + i.ToString()); p.Value = ent.LocalInternals[i].ToColumnType(ent.LocalInternals[i].GetValue(obj)); cmd.Parameters.Add(p); } } cmd.CommandText += (") VALUES (" + insert + ") " + update); cmd.ExecuteNonQuery(); cmd.Dispose(); if (!isBase) { foreach (__Field i in ent.Externals) { i.UpdateReferences(obj); } } if (Cache != null) { Cache.Put(obj); } }