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); }