private VirtualKey RegisterManyToOneVKey(Type type, FieldInfo fi) { VirtualKey template; MappedByAttribute a = AttributeWorker.GetMappedByAttribute(fi); if (a != null) { Type fType = fi.FieldType; FieldInfo tmp = _worker.RetrieveField(fType, a.MappedBy, true); if (tmp == null) { throw new Serializer.SerializerException(); } RelationalAttribute rTmp = AttributeWorker.GetRelationAttribute(tmp); if (rTmp == null || !(rTmp is OneToManyAttribute)) { throw new Serializer.SerializerException(); } if (AttributeWorker.GetJoinColumnsAttributes(fi).Length > 0) { throw new Serializer.SerializerException(); } template = CreateTemplateEntry(type, fType); template.TargetField = fi; } else { Type navigatedType = fi.FieldType; template = CreateTemplateEntry(type, navigatedType); JoinColumsAttribute[] jcs = AttributeWorker.GetJoinColumnsAttributes(fi); if (jcs.Length <= 0) { throw new Serializer.SerializerException(); } foreach (JoinColumsAttribute jc in jcs) { Console.WriteLine(type + ":" + _worker.RetrieveField(type, jc.JoinColumn, false)); Console.WriteLine(navigatedType + ":" + _worker.RetrieveField(navigatedType, jc.DefColumn, false)); FieldInfo tmp = _worker.RetrieveField(type, jc.JoinColumn, false); if (tmp == null) { throw new Serializer.SerializerException(); } template.AddJoinKeyField(jc.JoinColumn, tmp); template.TargetType = type; List <String> tmpList; try { tmpList = _foreignKeys[type]; } catch (KeyNotFoundException) { tmpList = new List <String>(); _foreignKeys[type] = tmpList; } tmpList.Add(jc.JoinColumn); tmp = _worker.RetrieveField(navigatedType, jc.DefColumn, false); if (tmp == null) { throw new Serializer.SerializerException(); } template.AddDefKeyField(jc.DefColumn, tmp); template.SourceType = navigatedType; template.AddKeyTranslation(jc.DefColumn, jc.JoinColumn); template.TargetField = fi; } } return(template); }
private VirtualKey RegisterOneToManyVKey(Type type, FieldInfo fi) { VirtualKey template; if (!fi.FieldType.IsGenericType) { throw new Serializer.SerializerException(); } if (fi.FieldType.GetGenericArguments().Length != 1) { throw new Serializer.SerializerException(); } if (AttributeWorker.GetMappedByAttribute(fi) != null) { throw new Serializer.SerializerException(); } Type navigatedType = fi.FieldType.GetGenericArguments()[0]; template = CreateTemplateEntry(type, navigatedType); JoinColumsAttribute[] jcs = AttributeWorker.GetJoinColumnsAttributes(fi); if (jcs.Length <= 0) { throw new Serializer.SerializerException(); } foreach (JoinColumsAttribute jc in jcs) { Console.WriteLine(type + ":" + _worker.RetrieveField(type, jc.DefColumn, false)); Console.WriteLine(navigatedType + ":" + _worker.RetrieveField(navigatedType, jc.JoinColumn, false)); FieldInfo tmp = _worker.RetrieveField(type, jc.DefColumn, false); if (tmp == null) { throw new Serializer.SerializerException(); } template.AddDefKeyField(jc.DefColumn, tmp); template.SourceType = type; tmp = _worker.RetrieveField(navigatedType, jc.JoinColumn, false); if (tmp == null) { throw new Serializer.SerializerException("Field " + jc.JoinColumn + " in " + navigatedType.FullName + " not found!"); } template.AddJoinKeyField(jc.JoinColumn, tmp); template.TargetType = navigatedType; List <String> tmpList; try { tmpList = _foreignKeys[navigatedType]; } catch (KeyNotFoundException) { tmpList = new List <String>(); _foreignKeys[navigatedType] = tmpList; } tmpList.Add(jc.JoinColumn); template.AddKeyTranslation(jc.DefColumn, jc.JoinColumn); template.SourceField = fi; } return(template); }