Пример #1
0
        /// <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);
        }