|
@@ -610,11 +610,12 @@ namespace InABox.Database.SQLite
|
|
|
var cascadeFields = new List<string>();
|
|
|
|
|
|
var props = DatabaseSchema.RootProperties(otherType)
|
|
|
- .Where(x => x.IsEntityLink
|
|
|
+ .Where(x => x.IsEntityLink
|
|
|
&& x.PropertyType.GetInterfaceDefinition(typeof(IEntityLink<>))?.GenericTypeArguments[0] == type
|
|
|
- && !x.HasAttribute<ChildEntityAttribute>());
|
|
|
+ && !x.IsCalculated);
|
|
|
foreach(var prop in props)
|
|
|
- { var fieldname = $"{prop.Name}.ID";
|
|
|
+ {
|
|
|
+ var fieldname = $"{prop.Name}.ID";
|
|
|
if(prop.GetAttribute<EntityRelationshipAttribute>() is EntityRelationshipAttribute attr
|
|
|
&& attr.Action == DeleteAction.Cascade)
|
|
|
{
|
|
@@ -628,8 +629,14 @@ namespace InABox.Database.SQLite
|
|
|
cascadeFields.Sort();
|
|
|
setNullFields.Sort();
|
|
|
|
|
|
- cascades.Add(new(otherType, cascadeFields));
|
|
|
- setNulls.Add(new(otherType, setNullFields));
|
|
|
+ if(cascadeFields.Count > 0)
|
|
|
+ {
|
|
|
+ cascades.Add(new(otherType, cascadeFields));
|
|
|
+ }
|
|
|
+ if(setNulls.Count > 0)
|
|
|
+ {
|
|
|
+ setNulls.Add(new(otherType, setNullFields));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if(cascades.Count > 0)
|
|
@@ -2299,24 +2306,24 @@ namespace InABox.Database.SQLite
|
|
|
if (item.ID == Guid.Empty)
|
|
|
item.ID = Guid.NewGuid();
|
|
|
|
|
|
- Dictionary<string, object> insert = item.GetValues(true);
|
|
|
- Dictionary<string, object> update = item.GetValues(false);
|
|
|
+ var insert = item.GetValues(true);
|
|
|
+ var update = item.GetValues(false);
|
|
|
|
|
|
var insertfields = new List<string>();
|
|
|
var insertvalues = new List<string>();
|
|
|
var updatecommands = new List<string>();
|
|
|
|
|
|
var iParam = 0;
|
|
|
- foreach (var key in insert.Keys)
|
|
|
+ foreach (var (key, v) in insert)
|
|
|
{
|
|
|
- if (insert[key] is UserProperties)
|
|
|
+ if (v is UserProperties)
|
|
|
continue;
|
|
|
|
|
|
var sParam = string.Format("@p{0}", iParam++);
|
|
|
object? value = null;
|
|
|
try
|
|
|
{
|
|
|
- value = Encode(insert[key], insert[key]?.GetType());
|
|
|
+ value = Encode(v, v?.GetType());
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
@@ -2334,17 +2341,19 @@ namespace InABox.Database.SQLite
|
|
|
updatecommands.Add(string.Format("[{0}]={1}", key, sParam));
|
|
|
}
|
|
|
|
|
|
- var particles = new List<string>();
|
|
|
- particles.Add("INSERT INTO");
|
|
|
- particles.Add(T.EntityName().Split('.').Last());
|
|
|
- particles.Add("(");
|
|
|
- particles.Add(string.Join(",", insertfields));
|
|
|
- particles.Add(")");
|
|
|
- particles.Add("VALUES");
|
|
|
- particles.Add("(");
|
|
|
- particles.Add(string.Join(",", insertvalues));
|
|
|
- particles.Add(")");
|
|
|
- if (updatecommands.Any())
|
|
|
+ var particles = new List<string>
|
|
|
+ {
|
|
|
+ "INSERT INTO",
|
|
|
+ T.EntityName().Split('.').Last(),
|
|
|
+ "(",
|
|
|
+ string.Join(",", insertfields),
|
|
|
+ ")",
|
|
|
+ "VALUES",
|
|
|
+ "(",
|
|
|
+ string.Join(",", insertvalues),
|
|
|
+ ")"
|
|
|
+ };
|
|
|
+ if (updatecommands.Count != 0)
|
|
|
particles.Add("ON CONFLICT([ID]) DO UPDATE SET " + string.Join(", ", updatecommands));
|
|
|
else
|
|
|
particles.Add("ON CONFLICT DO NOTHING");
|