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