Esempio n. 1
0
        private static int[] CreateMapping <TFrom, TTo>(
            IKeyInfo <TFrom> primaryKeyInfo,
            IKeyInfo <TTo> foreignKeyInfo,
            IRelationContraint[] constraints,
            bool invert)
        {
            int memberCount = primaryKeyInfo.EntityKeyMembers.Length;

            if (foreignKeyInfo.EntityKeyMembers.Length != memberCount)
            {
                throw new ArgumentException("", "foreignKeyInfo");
            }

            if (constraints.Length != memberCount)
            {
                throw new ArgumentException("", "constraints");
            }

            List <int> mapping = new List <int>();

            for (int i = 0; i < memberCount; i++)
            {
                MemberInfo fromMember = primaryKeyInfo.EntityKeyMembers[i];

                IRelationContraint constraint = constraints
                                                .FirstOrDefault(c =>
                                                                c.PrimaryField == fromMember);

                if (constraint == null)
                {
                    throw new ArgumentException("", "constraints");
                }

                int mappedIndex = foreignKeyInfo
                                  .EntityKeyMembers
                                  .ToList()
                                  .IndexOf(constraint.ForeignField);

                if (mappedIndex == -1)
                {
                    throw new ArgumentException("", "constraints");
                }

                mapping.Add(mappedIndex);
            }

            if (invert)
            {
                List <int> invertedMapping = new List <int>();

                for (int i = 0; i < memberCount; i++)
                {
                    invertedMapping.Add(mapping.IndexOf(i));
                }

                mapping = invertedMapping;
            }

            return(mapping.ToArray());
        }
Esempio n. 2
0
        public void Configure(AssociationInfo associationInfo, DbSchemaBuilder builder)
        {
            var primary = associationInfo.PrimaryTable;
            var foreign = associationInfo.ForeignTable;

            DbTableInfoBuilder primaryTable = builder.Find(primary.TableName);
            DbTableInfoBuilder foreignTable = builder.Find(foreign.TableName);

            MemberInfo[] primaryKeyMembers =
                GetMembers(
                    primaryTable.EntityType,
                    primary.PropertyNames);

            MemberInfo[] foreignKeyMembers =
                GetMembers(
                    foreignTable.EntityType,
                    foreign.PropertyNames);

            IKeyInfo primaryKeyInfo =
                EnsureKey(
                    primaryKeyMembers,
                    true,
                    primaryTable);

            IKeyInfo foreignKeyInfo =
                EnsureKey(
                    foreignKeyMembers,
                    false,
                    foreignTable);

            IRelationContraint[] relationConstraints =
                new IRelationContraint[primaryKeyMembers.Length];

            for (int i = 0; i < relationConstraints.Length; i++)
            {
                relationConstraints[i] =
                    new RelationConstraint(primaryKeyMembers[i], foreignKeyMembers[i]);
            }

            Delegate primaryToForeignConverter =
                CreateConverter(
                    PrimaryToForeignConverterMethod,
                    primaryKeyInfo,
                    foreignKeyInfo,
                    relationConstraints);

            Delegate foreignToPrimaryConverter =
                CreateConverter(
                    ForeignToPrimaryConverterMethod,
                    primaryKeyInfo,
                    foreignKeyInfo,
                    relationConstraints);

            builder.Register(
                new DbRelationInfo(
                    primaryTable:               primary.TableName,
                    primaryKeyInfo:             primaryKeyInfo,
                    primaryToForeignConverter:  primaryToForeignConverter,
                    foreignTable:               foreign.TableName,
                    foreignKeyInfo:             foreignKeyInfo,
                    foreignToPrimaryConverter:  foreignToPrimaryConverter,
                    cascadedDelete:             associationInfo.CascadedDelete));
        }
Esempio n. 3
0
        public void Configure(AssociationInfo associationInfo, DbSchemaBuilder builder)
        {
            var primary = associationInfo.PrimaryTable;
            var foreign = associationInfo.ForeignTable;

            DbTableInfoBuilder primaryTable = builder.Find(primary.TableName);
            DbTableInfoBuilder foreignTable = builder.Find(foreign.TableName);

            MemberInfo[] primaryKeyMembers = 
                GetMembers(
                    primaryTable.EntityType,
                    primary.PropertyNames);

            MemberInfo[] foreignKeyMembers =
                GetMembers(
                    foreignTable.EntityType,
                    foreign.PropertyNames);

            IKeyInfo primaryKeyInfo = 
                EnsureKey(
                    primaryKeyMembers,
                    true,
                    primaryTable);

            IKeyInfo foreignKeyInfo = 
                EnsureKey(
                    foreignKeyMembers,
                    false,
                    foreignTable);

            IRelationContraint[] relationConstraints =
                new IRelationContraint[primaryKeyMembers.Length];

            for (int i = 0; i < relationConstraints.Length; i++)
            {
                relationConstraints[i] =
                    new RelationConstraint(primaryKeyMembers[i], foreignKeyMembers[i]);
            }

            Delegate primaryToForeignConverter =
                CreateConverter(
                    PrimaryToForeignConverterMethod,
                    primaryKeyInfo,
                    foreignKeyInfo,
                    relationConstraints);

            Delegate foreignToPrimaryConverter =
                CreateConverter(
                    ForeignToPrimaryConverterMethod,
                    primaryKeyInfo,
                    foreignKeyInfo,
                    relationConstraints);

            builder.Register(
                new DbRelationInfo(
                    primaryTable:               primary.TableName,
                    primaryKeyInfo:             primaryKeyInfo,
                    primaryToForeignConverter:  primaryToForeignConverter,
                    foreignTable:               foreign.TableName,
                    foreignKeyInfo:             foreignKeyInfo,
                    foreignToPrimaryConverter:  foreignToPrimaryConverter,
                    cascadedDelete:             associationInfo.CascadedDelete)); 
        }
Esempio n. 4
0
        private static Delegate CreateConverter(
            MethodInfo converterMethod,
            IKeyInfo primaryKeyInfo,
            IKeyInfo foreignKeyInfo,
            IRelationContraint[] relationConstraints)
        {
            MethodInfo factory = converterMethod
                .GetGenericMethodDefinition()
                .MakeGenericMethod(primaryKeyInfo.KeyType, foreignKeyInfo.KeyType);

            Delegate result = factory.Invoke(
                null,
                new object[] 
                { 
                    primaryKeyInfo, 
                    foreignKeyInfo, 
                    relationConstraints.ToArray() 
                }) as Delegate;

            return result;
        }