/// <summary> /// Make a new item, with optional passed-in name-value collection as initialiser. /// </summary> /// <param name="connection">The connection to use</param> /// <param name="nameValues">The name-value collection</param> /// <param name="addNonPresentAsDefaults"> /// If true also include default values for fields not present in the collection /// but which exist in columns for the current table in Mighty, which correctly /// reflect the defaults of the current database table. /// </param> /// <returns></returns> override public T New(DbConnection connection, object nameValues = null, bool addNonPresentAsDefaults = true) { var nvtEnumerator = new NameValueTypeEnumerator(DataContract, nameValues); Dictionary <string, object> columnNameToValue = new Dictionary <string, object>(); foreach (var nvtInfo in nvtEnumerator) { if (DataContract.TryGetColumnName(nvtInfo.Name, out string columnName)) { columnNameToValue.Add(columnName, nvtInfo.Value); } } object item; IDictionary <string, object> newItemDictionary = null; if (!IsGeneric) { item = new ExpandoObject(); newItemDictionary = ((ExpandoObject)item).ToDictionary(); } else { item = new T(); } // drive the loop by the actual column names foreach (var columnInfo in GetTableMetaData(connection)) { if (!columnInfo.IS_MIGHTY_COLUMN) { continue; } string columnName = columnInfo.COLUMN_NAME; object value; if (!columnNameToValue.TryGetValue(columnName, out value)) { if (!addNonPresentAsDefaults) { continue; } value = Plugin.GetColumnDefault(columnInfo); } if (value != null) { if (IsGeneric) { DataContract.GetDataMemberInfo(columnName).SetValue(item, value); } else { newItemDictionary.Add(columnName, value); } } } return((T)item); }