This commit is contained in:
grzegorz.russek
2019-12-18 16:13:08 +00:00
parent 552f7a1f86
commit 7ce3a00613
6 changed files with 155 additions and 115 deletions

View File

@@ -8176,8 +8176,8 @@ namespace DynamORM
{ {
IsDisposed = true; IsDisposed = true;
if (Schema != null) ////if (Schema != null)
Schema.Clear(); //// Schema.Clear();
Owner = Name = Alias = null; Owner = Name = Alias = null;
Schema = null; Schema = null;
@@ -13472,13 +13472,21 @@ namespace DynamORM
{ {
if (val != null) if (val != null)
{ {
var lst = (val as IEnumerable<object>).Select(x => GetElementVal(ArrayType, x)).ToList(); if (val is IEnumerable<object>)
{
var lst = (val as IEnumerable<object>).Select(x => GetElementVal(ArrayType, x)).ToList();
value = Array.CreateInstance(ArrayType, lst.Count); value = Array.CreateInstance(ArrayType, lst.Count);
int i = 0; int i = 0;
foreach (var e in lst) foreach (var e in lst)
((Array)value).SetValue(e, i++); ((Array)value).SetValue(e, i++);
}
else
{
value = Array.CreateInstance(ArrayType, 1);
((Array)value).SetValue(GetElementVal(ArrayType, val), 0);
}
} }
else else
value = Array.CreateInstance(ArrayType, 0); value = Array.CreateInstance(ArrayType, 0);
@@ -13535,7 +13543,7 @@ namespace DynamORM
Guid g; Guid g;
return Guid.TryParse((string)val, out g) ? g : Guid.Empty; 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<string, object>)))
return val.Map(type); return val.Map(type);
else else
try try
@@ -13608,6 +13616,10 @@ namespace DynamORM
foreach (PropertyInfo pi in GetAllMembers(Type).Where(x => x is PropertyInfo).Cast<PropertyInfo>()) foreach (PropertyInfo pi in GetAllMembers(Type).Where(x => x is PropertyInfo).Cast<PropertyInfo>())
{ {
// Skip indexers
if (pi.GetIndexParameters().Any())
continue;
ColumnAttribute attr = null; ColumnAttribute attr = null;
object[] attrs = pi.GetCustomAttributes(typeof(ColumnAttribute), true); object[] attrs = pi.GetCustomAttributes(typeof(ColumnAttribute), true);
@@ -13957,13 +13969,16 @@ namespace DynamORM
/// <returns>Returns <c>true</c> if operation was successful.</returns> /// <returns>Returns <c>true</c> if operation was successful.</returns>
public virtual bool Insert(DynamicDatabase db) public virtual bool Insert(DynamicDatabase db)
{ {
if (db.Insert(this.GetType()) using (var query = db.Insert(this.GetType()))
.Values(x => this)
.Execute() > 0)
{ {
_changedFields.Clear(); if (query
SetDynamicEntityState(DynamicEntityState.Existing); .Values(x => this)
return true; .Execute() > 0)
{
_changedFields.Clear();
SetDynamicEntityState(DynamicEntityState.Existing);
return true;
}
} }
return false; return false;
@@ -13976,47 +13991,48 @@ namespace DynamORM
{ {
var t = GetType(); var t = GetType();
var mapper = DynamicMapperCache.GetMapper(t); var mapper = DynamicMapperCache.GetMapper(t);
var query = db.Update(t); using (var query = db.Update(t))
MakeQueryWhere(mapper, query);
if (_changedFields.Any())
{ {
bool any = false; MakeQueryWhere(mapper, query);
foreach (var cf in _changedFields) if (_changedFields.Any())
{ {
var cn = mapper.PropertyMap[cf.Key]; bool any = false;
var pm = mapper.ColumnsMap[cn.ToLower()];
if (pm.Ignore)
continue;
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; continue;
if (!pm.Column.AllowNull && cf.Value == null) if (pm.Column != null)
continue; {
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); if (!any)
any = true; query.Set(x => this);
} }
else
if (!any)
query.Set(x => this); 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;
} }
/// <summary>Deletes this object from database.</summary> /// <summary>Deletes this object from database.</summary>
@@ -14027,14 +14043,15 @@ namespace DynamORM
var t = this.GetType(); var t = this.GetType();
var mapper = DynamicMapperCache.GetMapper(t); 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) SetDynamicEntityState(DynamicEntityState.Deleted);
return false; }
SetDynamicEntityState(DynamicEntityState.Deleted);
return true; return true;
} }
@@ -14051,17 +14068,19 @@ namespace DynamORM
{ {
var t = this.GetType(); var t = this.GetType();
var mapper = DynamicMapperCache.GetMapper(t); var mapper = DynamicMapperCache.GetMapper(t);
var query = db.From(t); using (var query = db.From(t))
MakeQueryWhere(mapper, query); {
var o = (query.Execute() as IEnumerable<dynamic>).FirstOrDefault(); MakeQueryWhere(mapper, query);
var o = (query.Execute() as IEnumerable<dynamic>).FirstOrDefault();
if (o == null) if (o == null)
return false; return false;
mapper.Map(o, this); mapper.Map(o, this);
SetDynamicEntityState(DynamicEntityState.Existing); SetDynamicEntityState(DynamicEntityState.Existing);
_changedFields.Clear(); _changedFields.Clear();
}
return true; return true;
} }

View File

@@ -139,8 +139,8 @@ namespace DynamORM.Builders.Implementation
{ {
IsDisposed = true; IsDisposed = true;
if (Schema != null) ////if (Schema != null)
Schema.Clear(); //// Schema.Clear();
Owner = Name = Alias = null; Owner = Name = Alias = null;
Schema = null; Schema = null;

View File

@@ -168,13 +168,21 @@ namespace DynamORM.Mapper
{ {
if (val != null) if (val != null)
{ {
var lst = (val as IEnumerable<object>).Select(x => GetElementVal(ArrayType, x)).ToList(); if (val is IEnumerable<object>)
{
var lst = (val as IEnumerable<object>).Select(x => GetElementVal(ArrayType, x)).ToList();
value = Array.CreateInstance(ArrayType, lst.Count); value = Array.CreateInstance(ArrayType, lst.Count);
int i = 0; int i = 0;
foreach (var e in lst) foreach (var e in lst)
((Array)value).SetValue(e, i++); ((Array)value).SetValue(e, i++);
}
else
{
value = Array.CreateInstance(ArrayType, 1);
((Array)value).SetValue(GetElementVal(ArrayType, val), 0);
}
} }
else else
value = Array.CreateInstance(ArrayType, 0); value = Array.CreateInstance(ArrayType, 0);
@@ -231,7 +239,7 @@ namespace DynamORM.Mapper
Guid g; Guid g;
return Guid.TryParse((string)val, out g) ? g : Guid.Empty; 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<string, object>)))
return val.Map(type); return val.Map(type);
else else
try try

View File

@@ -82,6 +82,10 @@ namespace DynamORM.Mapper
foreach (PropertyInfo pi in GetAllMembers(Type).Where(x => x is PropertyInfo).Cast<PropertyInfo>()) foreach (PropertyInfo pi in GetAllMembers(Type).Where(x => x is PropertyInfo).Cast<PropertyInfo>())
{ {
// Skip indexers
if (pi.GetIndexParameters().Any())
continue;
ColumnAttribute attr = null; ColumnAttribute attr = null;
object[] attrs = pi.GetCustomAttributes(typeof(ColumnAttribute), true); object[] attrs = pi.GetCustomAttributes(typeof(ColumnAttribute), true);

View File

@@ -102,13 +102,16 @@ namespace DynamORM.Objects
/// <returns>Returns <c>true</c> if operation was successful.</returns> /// <returns>Returns <c>true</c> if operation was successful.</returns>
public virtual bool Insert(DynamicDatabase db) public virtual bool Insert(DynamicDatabase db)
{ {
if (db.Insert(this.GetType()) using (var query = db.Insert(this.GetType()))
.Values(x => this)
.Execute() > 0)
{ {
_changedFields.Clear(); if (query
SetDynamicEntityState(DynamicEntityState.Existing); .Values(x => this)
return true; .Execute() > 0)
{
_changedFields.Clear();
SetDynamicEntityState(DynamicEntityState.Existing);
return true;
}
} }
return false; return false;
@@ -121,47 +124,49 @@ namespace DynamORM.Objects
{ {
var t = GetType(); var t = GetType();
var mapper = DynamicMapperCache.GetMapper(t); var mapper = DynamicMapperCache.GetMapper(t);
var query = db.Update(t); using (var query = db.Update(t))
MakeQueryWhere(mapper, query);
if (_changedFields.Any())
{ {
bool any = false;
foreach (var cf in _changedFields) MakeQueryWhere(mapper, query);
if (_changedFields.Any())
{ {
var cn = mapper.PropertyMap[cf.Key]; bool any = false;
var pm = mapper.ColumnsMap[cn.ToLower()];
if (pm.Ignore)
continue;
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; continue;
if (!pm.Column.AllowNull && cf.Value == null) if (pm.Column != null)
continue; {
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); if (!any)
any = true; query.Set(x => this);
} }
else
if (!any)
query.Set(x => this); 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;
} }
/// <summary>Deletes this object from database.</summary> /// <summary>Deletes this object from database.</summary>
@@ -172,14 +177,15 @@ namespace DynamORM.Objects
var t = this.GetType(); var t = this.GetType();
var mapper = DynamicMapperCache.GetMapper(t); 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) SetDynamicEntityState(DynamicEntityState.Deleted);
return false; }
SetDynamicEntityState(DynamicEntityState.Deleted);
return true; return true;
} }
@@ -196,17 +202,19 @@ namespace DynamORM.Objects
{ {
var t = this.GetType(); var t = this.GetType();
var mapper = DynamicMapperCache.GetMapper(t); var mapper = DynamicMapperCache.GetMapper(t);
var query = db.From(t); using (var query = db.From(t))
MakeQueryWhere(mapper, query); {
var o = (query.Execute() as IEnumerable<dynamic>).FirstOrDefault(); MakeQueryWhere(mapper, query);
var o = (query.Execute() as IEnumerable<dynamic>).FirstOrDefault();
if (o == null) if (o == null)
return false; return false;
mapper.Map(o, this); mapper.Map(o, this);
SetDynamicEntityState(DynamicEntityState.Existing); SetDynamicEntityState(DynamicEntityState.Existing);
_changedFields.Clear(); _changedFields.Clear();
}
return true; return true;
} }

View File

@@ -23,7 +23,8 @@ namespace DynamORM.Objects
/// <returns>Objects enumerator.</returns> /// <returns>Objects enumerator.</returns>
public virtual IEnumerable<T> GetAll() public virtual IEnumerable<T> GetAll()
{ {
return EnumerateQuery(_database.From<T>()); using (var q = _database.From<T>())
return EnumerateQuery(q);
} }
/// <summary>Get rows from database by custom query.</summary> /// <summary>Get rows from database by custom query.</summary>