public static MappingOptionsSet AddDefaultRules(this MappingOptionsSet mappingOptionsSet)
        {
            mappingOptionsSet.AddTypeRule(x => !x.GetTypeInfo().IsAbstract, o => { throw new NotSupportedException("InheritedPropertyMapping supports abstract classes and interfaces only."); });
            mappingOptionsSet.AddTypeRule(x => x.GetCustomAttribute <TableAttribute>() != null, o => {
                TableAttribute attribute = o.Type.GetCustomAttribute <TableAttribute>();
                o.TableName    = attribute.TableName;
                o.LoadBehavior = attribute.LoadBehavior;
            });

            mappingOptionsSet.AddTypeRule(x => x.GetTypeInfo().ImplementedInterfaces.Contains(typeof(INotifyPropertyChanged)), o => {
                o.RaisePropertyChangeMethod = o.Type.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).Where(x =>
                                                                                                                                            x.GetParameters().Length == 1 &&
                                                                                                                                            x.GetParameters()[0].ParameterType == typeof(PropertyChangedEventArgs) &&
                                                                                                                                            x.GetCustomAttributes(typeof(IsRaisePropertyChangeMethodAttribute), true).Any()).FirstOrDefault();
            });

            mappingOptionsSet.AddMemberTypeRule(x => x.GetCustomAttribute <ForeignObjectMappingAttribute>() != null, x => { x.MappingType = MappingType.ForeignObjectMapping; });
            mappingOptionsSet.AddMemberTypeRule(x => x.GetCustomAttribute <ReferenceListMappingAttribute>() != null, x => { x.MappingType = MappingType.ReferenceListMapping; });

            mappingOptionsSet.AddMemberMappingRule(x => x.GetCustomAttribute <ForeignObjectMappingAttribute>() != null, o => {
                ForeignObjectMappingOptions options     = (ForeignObjectMappingOptions)o;
                ForeignObjectMappingAttribute attribute = options.Member.GetCustomAttribute <ForeignObjectMappingAttribute>();
                options.DatabaseFieldName = attribute.Fieldname;

                if (attribute.ForeignObjectType != null)
                {
                    options.ForeignObjectType = attribute.ForeignObjectType;
                }

                if (attribute.ReadOnly)
                {
                    options.IsReadonly = true;
                }
                else
                {
                    options.IsInsertable = attribute.Insertable;
                    options.IsUpdateable = attribute.Updateable;
                }
                options.IsPrimaryKey = options.Member.GetCustomAttribute <IsPrimaryKeyAttribute>() != null;
            });

            mappingOptionsSet.AddMemberMappingRule(x => x.GetCustomAttribute <ReferenceListMappingAttribute>() != null, o => {
                ReferenceListMappingOptions options     = (ReferenceListMappingOptions)o;
                ReferenceListMappingAttribute attribute = options.Member.GetCustomAttribute <ReferenceListMappingAttribute>();

                options.SaveCascade        = attribute.SaveCascade;
                options.DeleteCascade      = attribute.DeleteCascade;
                options.DropChangesCascade = attribute.DropChangesCascade;

                options.ForeignProperty = attribute.ForeignProperty ?? attribute.ForeignType.GetProperties().Where(x => x.PropertyType == options.Member.DeclaringType).Single();
                foreach (EqualsObjectConditionAttribute equalsObjectAttribute in options.Member.GetCustomAttributes <EqualsObjectConditionAttribute>())
                {
                    options.Conditions.Add(attribute.ForeignType.GetProperty(equalsObjectAttribute.PropertyName), equalsObjectAttribute.Value);
                }
            });

            mappingOptionsSet.AddMemberMappingRule(x => x.GetCustomAttribute <ForeignObjectMappingAttribute>() == null && x.GetCustomAttribute <ReferenceListMappingAttribute>() == null, o => {
                FieldMappingOptions options = (FieldMappingOptions)o;
                MappingAttribute attribute  = options.Member.GetCustomAttribute <MappingAttribute>();
                if (attribute != null)
                {
                    options.DatabaseFieldName = attribute.FieldName ?? options.DatabaseFieldName;
                    if (attribute.ReadOnly)
                    {
                        options.IsReadonly = true;
                    }
                    else
                    {
                        options.IsInsertable = attribute.Insertable;
                        options.IsUpdateable = attribute.Updateable;
                    }
                }
                options.IsPrimaryKey = options.Member.GetCustomAttribute <IsPrimaryKeyAttribute>() != null;
            });

            return(mappingOptionsSet);
        }
 public PropertyMapping(FieldMappingOptions options) : base(options)
 {
     _options       = options;
     _internalField = null;
 }
        public void InitializeDatabase(Action <IDatabaseInitializer> initFunc = null)
        {
            DataBaseInitializer initializer = _databaseProvider.GetDatabaseInitializer(_connectionString);

            initFunc?.Invoke(initializer);

            IEnumerable <Type> GetTypesOrderedCorrectly(IEnumerable <Type> types)
            {
                List <Type> typesList = types.ToList();

                while (typesList.Count > 0)
                {
                    for (int i = 0; i < typesList.Count; i++)
                    {
                        TypeMappingOptions typeMappingOptions = _mappingOptionsSet.GetTypeMappingOptions(typesList[i]);
                        if (!typeMappingOptions.MemberMappingOptions.OfType <ForeignObjectMappingOptions>()
                            .Where(x => typesList.Contains(x.ForeignObjectType))
                            .Any())
                        {
                            yield return(typesList[i]);

                            typesList.RemoveAt(i);
                        }
                    }
                }
            }

            foreach (Type type in GetTypesOrderedCorrectly(_relationalObjectProvider.Keys))
            {
                TypeMappingOptions typeMappingOptions = _mappingOptionsSet.GetTypeMappingOptions(type);
                initializer.AddTable(typeMappingOptions.TableName);
                foreach (FieldMappingOptions memberMappineOptions in typeMappingOptions.MemberMappingOptions.OfType <FieldMappingOptions>().OrderBy(x => x.IsPrimaryKey))
                {
                    if (memberMappineOptions.Type == MappingType.ReferenceListMapping)
                    {
                        continue;
                    }

                    if (memberMappineOptions is ForeignObjectMappingOptions foreignObjectMappingOptions)
                    {
                        initializer.AddField(foreignObjectMappingOptions.DatabaseFieldName, foreignObjectMappingOptions.KeyType);

                        FieldMappingOptions foreignFieldMappingOptions = foreignObjectMappingOptions.ForeignMember as FieldMappingOptions;
                        TypeMappingOptions  foreignTypeMappingOptions  = _mappingOptionsSet.GetTypeMappingOptions(foreignObjectMappingOptions.ForeignObjectType);

                        IEnumerable <ReferenceListMappingOptions> referenceListMappingOptions =
                            foreignTypeMappingOptions.MemberMappingOptions.OfType <ReferenceListMappingOptions>()
                            .Where(x => x.ForeignProperty == foreignObjectMappingOptions.Member);



                        initializer.AddForeignKey(
                            foreignTypeMappingOptions.TableName,
                            foreignFieldMappingOptions.DatabaseFieldName,
                            referenceListMappingOptions.Any(x => x.DeleteCascade));
                    }
                    else
                    {
                        initializer.AddField(memberMappineOptions.DatabaseFieldName, memberMappineOptions.Member.PropertyType);
                    }

                    if (memberMappineOptions.IsPrimaryKey)
                    {
                        initializer.SetIsKeyField(memberMappineOptions.IsReadonly);
                    }
                }
            }

            initializer.Flush();
        }
 /// <summary>
 /// Maps a field for uploading a contact list, it is done a zero based index
 /// </summary>
 /// <param name="locationIndex">zero based index left to right</param>
 /// <param name="option">Use RegOnline.RegressionTests.Manager.Emails.EmailManager.FieldMappingOptions</param>
 public void MapFields(int locationIndex, FieldMappingOptions fieldToMap)
 {
     UIUtil.DefaultProvider.SelectWithText(string.Format(FieldMapConstructor, locationIndex), StringEnum.GetStringValue(fieldToMap), LocateBy.Id);
 }