diff --git a/AmalgamationTool/DynamORM.Amalgamation.cs b/AmalgamationTool/DynamORM.Amalgamation.cs index 172b015..f180dc5 100644 --- a/AmalgamationTool/DynamORM.Amalgamation.cs +++ b/AmalgamationTool/DynamORM.Amalgamation.cs @@ -8176,8 +8176,8 @@ namespace DynamORM { IsDisposed = true; - if (Schema != null) - Schema.Clear(); + ////if (Schema != null) + //// Schema.Clear(); Owner = Name = Alias = null; Schema = null; @@ -13472,13 +13472,21 @@ namespace DynamORM { if (val != null) { - var lst = (val as IEnumerable).Select(x => GetElementVal(ArrayType, x)).ToList(); + if (val is IEnumerable) + { + var lst = (val as IEnumerable).Select(x => GetElementVal(ArrayType, x)).ToList(); - value = Array.CreateInstance(ArrayType, lst.Count); + value = Array.CreateInstance(ArrayType, lst.Count); - int i = 0; - foreach (var e in lst) - ((Array)value).SetValue(e, i++); + int i = 0; + foreach (var e in lst) + ((Array)value).SetValue(e, i++); + } + else + { + value = Array.CreateInstance(ArrayType, 1); + ((Array)value).SetValue(GetElementVal(ArrayType, val), 0); + } } else value = Array.CreateInstance(ArrayType, 0); @@ -13535,7 +13543,7 @@ namespace DynamORM Guid g; return Guid.TryParse((string)val, out g) ? g : Guid.Empty; } - else if (IsDataContract) + else if (!typeof(IConvertible).IsAssignableFrom(type) && (IsDataContract || (!type.IsValueType && val is IDictionary))) return val.Map(type); else try @@ -13608,6 +13616,10 @@ namespace DynamORM foreach (PropertyInfo pi in GetAllMembers(Type).Where(x => x is PropertyInfo).Cast()) { + // Skip indexers + if (pi.GetIndexParameters().Any()) + continue; + ColumnAttribute attr = null; object[] attrs = pi.GetCustomAttributes(typeof(ColumnAttribute), true); @@ -13957,13 +13969,16 @@ namespace DynamORM /// Returns true if operation was successful. public virtual bool Insert(DynamicDatabase db) { - if (db.Insert(this.GetType()) - .Values(x => this) - .Execute() > 0) + using (var query = db.Insert(this.GetType())) { - _changedFields.Clear(); - SetDynamicEntityState(DynamicEntityState.Existing); - return true; + if (query + .Values(x => this) + .Execute() > 0) + { + _changedFields.Clear(); + SetDynamicEntityState(DynamicEntityState.Existing); + return true; + } } return false; @@ -13976,47 +13991,48 @@ namespace DynamORM { var t = GetType(); var mapper = DynamicMapperCache.GetMapper(t); - var query = db.Update(t); - - MakeQueryWhere(mapper, query); - - if (_changedFields.Any()) + using (var query = db.Update(t)) { - bool any = false; + MakeQueryWhere(mapper, query); - foreach (var cf in _changedFields) + if (_changedFields.Any()) { - var cn = mapper.PropertyMap[cf.Key]; - var pm = mapper.ColumnsMap[cn.ToLower()]; - if (pm.Ignore) - continue; + bool any = false; - if (pm.Column != null) + foreach (var cf in _changedFields) { - if (pm.Column.IsKey) + var cn = mapper.PropertyMap[cf.Key]; + var pm = mapper.ColumnsMap[cn.ToLower()]; + if (pm.Ignore) continue; - if (!pm.Column.AllowNull && cf.Value == null) - continue; + if (pm.Column != null) + { + if (pm.Column.IsKey) + continue; + + if (!pm.Column.AllowNull && cf.Value == null) + continue; + } + + query.Values(cn, cf.Value); + any = true; } - query.Values(cn, cf.Value); - any = true; + if (!any) + query.Set(x => this); } - - if (!any) + else query.Set(x => this); + + if (query.Execute() == 0) + return false; + + SetDynamicEntityState(DynamicEntityState.Existing); + _changedFields.Clear(); + + return true; } - else - query.Set(x => this); - - if (query.Execute() == 0) - return false; - - SetDynamicEntityState(DynamicEntityState.Existing); - _changedFields.Clear(); - - return true; } /// Deletes this object from database. @@ -14027,14 +14043,15 @@ namespace DynamORM var t = this.GetType(); var mapper = DynamicMapperCache.GetMapper(t); - var query = db.Delete(t); + using (var query = db.Delete(t)) + { + MakeQueryWhere(mapper, query); - MakeQueryWhere(mapper, query); + if (query.Execute() == 0) + return false; - if (query.Execute() == 0) - return false; - - SetDynamicEntityState(DynamicEntityState.Deleted); + SetDynamicEntityState(DynamicEntityState.Deleted); + } return true; } @@ -14051,17 +14068,19 @@ namespace DynamORM { var t = this.GetType(); var mapper = DynamicMapperCache.GetMapper(t); - var query = db.From(t); - MakeQueryWhere(mapper, query); - var o = (query.Execute() as IEnumerable).FirstOrDefault(); + using (var query = db.From(t)) + { + MakeQueryWhere(mapper, query); + var o = (query.Execute() as IEnumerable).FirstOrDefault(); - if (o == null) - return false; + if (o == null) + return false; - mapper.Map(o, this); + mapper.Map(o, this); - SetDynamicEntityState(DynamicEntityState.Existing); - _changedFields.Clear(); + SetDynamicEntityState(DynamicEntityState.Existing); + _changedFields.Clear(); + } return true; } diff --git a/DynamORM/Builders/Implementation/DynamicQueryBuilder.cs b/DynamORM/Builders/Implementation/DynamicQueryBuilder.cs index d1d04b8..a6c8958 100644 --- a/DynamORM/Builders/Implementation/DynamicQueryBuilder.cs +++ b/DynamORM/Builders/Implementation/DynamicQueryBuilder.cs @@ -139,8 +139,8 @@ namespace DynamORM.Builders.Implementation { IsDisposed = true; - if (Schema != null) - Schema.Clear(); + ////if (Schema != null) + //// Schema.Clear(); Owner = Name = Alias = null; Schema = null; diff --git a/DynamORM/Mapper/DynamicPropertyInvoker.cs b/DynamORM/Mapper/DynamicPropertyInvoker.cs index e33b749..6a77b65 100644 --- a/DynamORM/Mapper/DynamicPropertyInvoker.cs +++ b/DynamORM/Mapper/DynamicPropertyInvoker.cs @@ -168,13 +168,21 @@ namespace DynamORM.Mapper { if (val != null) { - var lst = (val as IEnumerable).Select(x => GetElementVal(ArrayType, x)).ToList(); + if (val is IEnumerable) + { + var lst = (val as IEnumerable).Select(x => GetElementVal(ArrayType, x)).ToList(); - value = Array.CreateInstance(ArrayType, lst.Count); + value = Array.CreateInstance(ArrayType, lst.Count); - int i = 0; - foreach (var e in lst) - ((Array)value).SetValue(e, i++); + int i = 0; + foreach (var e in lst) + ((Array)value).SetValue(e, i++); + } + else + { + value = Array.CreateInstance(ArrayType, 1); + ((Array)value).SetValue(GetElementVal(ArrayType, val), 0); + } } else value = Array.CreateInstance(ArrayType, 0); @@ -231,7 +239,7 @@ namespace DynamORM.Mapper Guid g; return Guid.TryParse((string)val, out g) ? g : Guid.Empty; } - else if (IsDataContract) + else if (!typeof(IConvertible).IsAssignableFrom(type) && (IsDataContract || (!type.IsValueType && val is IDictionary))) return val.Map(type); else try diff --git a/DynamORM/Mapper/DynamicTypeMap.cs b/DynamORM/Mapper/DynamicTypeMap.cs index 1e1b933..ddd1a55 100644 --- a/DynamORM/Mapper/DynamicTypeMap.cs +++ b/DynamORM/Mapper/DynamicTypeMap.cs @@ -82,6 +82,10 @@ namespace DynamORM.Mapper foreach (PropertyInfo pi in GetAllMembers(Type).Where(x => x is PropertyInfo).Cast()) { + // Skip indexers + if (pi.GetIndexParameters().Any()) + continue; + ColumnAttribute attr = null; object[] attrs = pi.GetCustomAttributes(typeof(ColumnAttribute), true); diff --git a/DynamORM/Objects/DynamicEntityBase.cs b/DynamORM/Objects/DynamicEntityBase.cs index f044898..51d413d 100644 --- a/DynamORM/Objects/DynamicEntityBase.cs +++ b/DynamORM/Objects/DynamicEntityBase.cs @@ -102,13 +102,16 @@ namespace DynamORM.Objects /// Returns true if operation was successful. public virtual bool Insert(DynamicDatabase db) { - if (db.Insert(this.GetType()) - .Values(x => this) - .Execute() > 0) + using (var query = db.Insert(this.GetType())) { - _changedFields.Clear(); - SetDynamicEntityState(DynamicEntityState.Existing); - return true; + if (query + .Values(x => this) + .Execute() > 0) + { + _changedFields.Clear(); + SetDynamicEntityState(DynamicEntityState.Existing); + return true; + } } return false; @@ -121,47 +124,49 @@ namespace DynamORM.Objects { var t = GetType(); var mapper = DynamicMapperCache.GetMapper(t); - var query = db.Update(t); - - MakeQueryWhere(mapper, query); - - if (_changedFields.Any()) + using (var query = db.Update(t)) { - bool any = false; - foreach (var cf in _changedFields) + MakeQueryWhere(mapper, query); + + if (_changedFields.Any()) { - var cn = mapper.PropertyMap[cf.Key]; - var pm = mapper.ColumnsMap[cn.ToLower()]; - if (pm.Ignore) - continue; + bool any = false; - if (pm.Column != null) + foreach (var cf in _changedFields) { - if (pm.Column.IsKey) + var cn = mapper.PropertyMap[cf.Key]; + var pm = mapper.ColumnsMap[cn.ToLower()]; + if (pm.Ignore) continue; - if (!pm.Column.AllowNull && cf.Value == null) - continue; + if (pm.Column != null) + { + if (pm.Column.IsKey) + continue; + + if (!pm.Column.AllowNull && cf.Value == null) + continue; + } + + query.Values(cn, cf.Value); + any = true; } - query.Values(cn, cf.Value); - any = true; + if (!any) + query.Set(x => this); } - - if (!any) + else query.Set(x => this); + + if (query.Execute() == 0) + return false; + + SetDynamicEntityState(DynamicEntityState.Existing); + _changedFields.Clear(); + + return true; } - else - query.Set(x => this); - - if (query.Execute() == 0) - return false; - - SetDynamicEntityState(DynamicEntityState.Existing); - _changedFields.Clear(); - - return true; } /// Deletes this object from database. @@ -172,14 +177,15 @@ namespace DynamORM.Objects var t = this.GetType(); var mapper = DynamicMapperCache.GetMapper(t); - var query = db.Delete(t); + using (var query = db.Delete(t)) + { + MakeQueryWhere(mapper, query); - MakeQueryWhere(mapper, query); + if (query.Execute() == 0) + return false; - if (query.Execute() == 0) - return false; - - SetDynamicEntityState(DynamicEntityState.Deleted); + SetDynamicEntityState(DynamicEntityState.Deleted); + } return true; } @@ -196,17 +202,19 @@ namespace DynamORM.Objects { var t = this.GetType(); var mapper = DynamicMapperCache.GetMapper(t); - var query = db.From(t); - MakeQueryWhere(mapper, query); - var o = (query.Execute() as IEnumerable).FirstOrDefault(); + using (var query = db.From(t)) + { + MakeQueryWhere(mapper, query); + var o = (query.Execute() as IEnumerable).FirstOrDefault(); - if (o == null) - return false; + if (o == null) + return false; - mapper.Map(o, this); + mapper.Map(o, this); - SetDynamicEntityState(DynamicEntityState.Existing); - _changedFields.Clear(); + SetDynamicEntityState(DynamicEntityState.Existing); + _changedFields.Clear(); + } return true; } diff --git a/DynamORM/Objects/DynamicRepositoryBase.cs b/DynamORM/Objects/DynamicRepositoryBase.cs index e954572..4c41330 100644 --- a/DynamORM/Objects/DynamicRepositoryBase.cs +++ b/DynamORM/Objects/DynamicRepositoryBase.cs @@ -23,7 +23,8 @@ namespace DynamORM.Objects /// Objects enumerator. public virtual IEnumerable GetAll() { - return EnumerateQuery(_database.From()); + using (var q = _database.From()) + return EnumerateQuery(q); } /// Get rows from database by custom query.